1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-05-05 15:54:21 +00:00

Adds size of output parameter to lisppathname() and replaces various strcpy() with strlcpy()

This commit is contained in:
Nick Briggs
2025-03-02 19:02:23 -08:00
parent dfb820cc62
commit 55209aa7e7
3 changed files with 15 additions and 14 deletions

View File

@@ -10,7 +10,7 @@ int unixpathname(char *src, char *dst, int dstlen, int versionp, int genp, char
#else #else
int unixpathname(char *src, char *dst, size_t dstlen, int versionp, int genp); int unixpathname(char *src, char *dst, size_t dstlen, int versionp, int genp);
#endif #endif
int lisppathname(char *fullname, char *lispname, int dirp, int versionp); int lisppathname(char *fullname, char *lispname, size_t lispnamesize, int dirp, int versionp);
int quote_fname(char *file); int quote_fname(char *file);
int quote_fname_ufs(char *file); int quote_fname_ufs(char *file);
int quote_dname(char *dir); int quote_dname(char *dir);

View File

@@ -1024,7 +1024,7 @@ LispPTR DSK_getfilename(LispPTR *args)
} else { } else {
dirp = 0; dirp = 0;
} }
if (lisppathname(vname, lfname, dirp, 0) == 0) return (NIL); if (lisppathname(vname, lfname, sizeof(lfname), dirp, 0) == 0) return (NIL);
STRING_BASE(args[2], base); STRING_BASE(args[2], base);
len = strlen(lfname); len = strlen(lfname);
@@ -1046,7 +1046,7 @@ LispPTR DSK_getfilename(LispPTR *args)
/* /*
* Now, vname holds the "versioned" full name of the recognized file in UNIX * Now, vname holds the "versioned" full name of the recognized file in UNIX
* format. We have to convert it back to Lisp format. The version field * format. We have to convert it back to Lisp format. The version field
* have to be converted. The fourth argument for lisppathname specifies it. * have to be converted. The fifth argument for lisppathname specifies it.
*/ */
#ifdef DOS #ifdef DOS
/* For DOS, have to assure we use the name asked for, not the */ /* For DOS, have to assure we use the name asked for, not the */
@@ -1059,7 +1059,7 @@ LispPTR DSK_getfilename(LispPTR *args)
} }
#endif /* DOS */ #endif /* DOS */
if (lisppathname(vname, lfname, dirp, (dirp ? 0 : 1)) == 0) return (NIL); if (lisppathname(vname, lfname, sizeof(lfname), dirp, (dirp ? 0 : 1)) == 0) return (NIL);
STRING_BASE(args[2], base); STRING_BASE(args[2], base);
len = strlen(lfname); len = strlen(lfname);
@@ -1498,7 +1498,7 @@ LispPTR DSK_directorynamep(LispPTR *args)
if (true_name(fullname) != -1) return (NIL); if (true_name(fullname) != -1) return (NIL);
/* Convert Unix file naming convention to Xerox Lisp one. */ /* Convert Unix file naming convention to Xerox Lisp one. */
if (lisppathname(fullname, dirname, 1, 0) == 0) return (NIL); if (lisppathname(fullname, dirname, sizeof(dirname), 1, 0) == 0) return (NIL);
len = strlen(dirname); len = strlen(dirname);
STRING_BASE(args[1], base); STRING_BASE(args[1], base);

View File

@@ -210,7 +210,7 @@ LispPTR UFS_getfilename(LispPTR *args)
* Now, we convert a file name back to Lisp format. The version field have not * Now, we convert a file name back to Lisp format. The version field have not
* to be converted. The fourth argument for lisppathname specifies it. * to be converted. The fourth argument for lisppathname specifies it.
*/ */
if (lisppathname(file, lfname, 0, 0) == 0) return (NIL); if (lisppathname(file, lfname, sizeof(lfname), 0, 0) == 0) return (NIL);
STRING_BASE(args[2], base); STRING_BASE(args[2], base);
len = strlen(lfname); len = strlen(lfname);
@@ -414,7 +414,7 @@ LispPTR UFS_directorynamep(LispPTR *args)
if (!S_ISDIR(sbuf.st_mode)) return (NIL); if (!S_ISDIR(sbuf.st_mode)) return (NIL);
/* Convert Unix file naming convention to Xerox Lisp one. */ /* Convert Unix file naming convention to Xerox Lisp one. */
if (lisppathname(fullname, dirname, 1, 0) == 0) return (NIL); if (lisppathname(fullname, dirname, sizeof(dirname), 1, 0) == 0) return (NIL);
len = strlen(dirname); len = strlen(dirname);
STRING_BASE(args[1], base); STRING_BASE(args[1], base);
@@ -846,6 +846,7 @@ int unixpathname(char *src, char *dst, size_t dstlen, int versionp, int genp)
* The lispname is used to determine which * The lispname is used to determine which
* character should be quoted in the result * character should be quoted in the result
* Xerox Lisp pathname representation. * Xerox Lisp pathname representation.
* size_t lispnamesize size of storage available for lispname
* int dirp If 1, fullname is a directory. If 0, * int dirp If 1, fullname is a directory. If 0,
* fullname is a file. * fullname is a file.
* int versionp If 1, version field is also converted * int versionp If 1, version field is also converted
@@ -872,7 +873,7 @@ int unixpathname(char *src, char *dst, size_t dstlen, int versionp, int genp)
* *
*/ */
int lisppathname(char *fullname, char *lispname, int dirp, int versionp) int lisppathname(char *fullname, char *lispname, size_t lispnamesize, int dirp, int versionp)
{ {
char *cp, *dp, *lnamep, *cnamep; char *cp, *dp, *lnamep, *cnamep;
char namebuf[MAXPATHLEN], fbuf[MAXPATHLEN], ver[VERSIONLEN]; char namebuf[MAXPATHLEN], fbuf[MAXPATHLEN], ver[VERSIONLEN];
@@ -983,7 +984,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
if (dirp) { if (dirp) {
if (*(dp - 1) != '>' || *(dp - 2) == '\'') *dp++ = '>'; if (*(dp - 1) != '>' || *(dp - 2) == '\'') *dp++ = '>';
*dp = '\0'; *dp = '\0';
strcpy(lispname, namebuf); strlcpy(lispname, namebuf, lispnamesize);
return (1); return (1);
} }
@@ -1047,7 +1048,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
* or not. If extension field is not included, we have to add a period * or not. If extension field is not included, we have to add a period
* to specify empty extension field. * to specify empty extension field.
*/ */
strcpy(fbuf, namebuf); strlcpy(fbuf, namebuf, sizeof(fbuf));
dp = cp = fbuf; dp = cp = fbuf;
while (*cp) { while (*cp) {
switch (*cp) { switch (*cp) {
@@ -1090,7 +1091,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
if (versionp && *ver != '\0') { if (versionp && *ver != '\0') {
conc_name_and_version(fbuf, ver, namebuf, MAXPATHLEN); conc_name_and_version(fbuf, ver, namebuf, MAXPATHLEN);
} else { } else {
strcpy(namebuf, fbuf); strlcpy(namebuf, fbuf, sizeof(namebuf));
} }
/* /*
@@ -1098,7 +1099,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
*/ */
if (!dirp && versionp) UnixVersionToLispVersion(namebuf, 0); if (!dirp && versionp) UnixVersionToLispVersion(namebuf, 0);
strcpy(lispname, namebuf); strlcpy(lispname, namebuf, lispnamesize);
return (1); return (1);
} }
@@ -1189,10 +1190,10 @@ int quote_fname(char *file)
if (*ver != '\0') { if (*ver != '\0') {
conc_name_and_version(fbuf, ver, namebuf, sizeof(namebuf)); conc_name_and_version(fbuf, ver, namebuf, sizeof(namebuf));
} else { } else {
strcpy(namebuf, fbuf); strlcpy(namebuf, fbuf, sizeof(namebuf));
} }
UnixVersionToLispVersion(namebuf, 1); UnixVersionToLispVersion(namebuf, 1);
strcpy(file, namebuf); strlcpy(file, namebuf, sizeof(file));
return (1); return (1);
} }