summaryrefslogtreecommitdiff
path: root/misc/mc/files/patch-vfs-direntry.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/mc/files/patch-vfs-direntry.c')
-rw-r--r--misc/mc/files/patch-vfs-direntry.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/misc/mc/files/patch-vfs-direntry.c b/misc/mc/files/patch-vfs-direntry.c
new file mode 100644
index 000000000000..8b8c7b7ed7c5
--- /dev/null
+++ b/misc/mc/files/patch-vfs-direntry.c
@@ -0,0 +1,102 @@
+--- vfs/direntry.c.orig Thu Dec 26 08:21:43 2002
++++ vfs/direntry.c Tue Jun 15 03:15:09 2004
+@@ -217,13 +217,11 @@
+ vfs_s_entry *
+ vfs_s_find_entry_tree (vfs *me, vfs_s_inode *root, char *path, int follow, int flags)
+ {
+- unsigned int pseg;
++ size_t pseg;
+ vfs_s_entry *ent = NULL;
+- char p[MC_MAXPATHLEN] = "";
++ char p[MC_MAXPATHLEN] = "", *t = p;
+
+ while (root){
+- int t;
+-
+ while (*path == PATH_SEP) /* Strip leading '/' */
+ path++;
+
+@@ -233,9 +231,14 @@
+ for (pseg = 0; path[pseg] && path[pseg] != PATH_SEP; pseg++)
+ ;
+
+- strcat (p, PATH_SEP_STR);
+- strncpy (p + (t = strlen (p)), path, pseg);
+- p[t + pseg] = '\0';
++ if (t + pseg + sizeof (PATH_SEP_STR) > p + sizeof (p))
++ ERRNOR (ENOMEM, NULL);
++
++ memcpy (t, PATH_SEP_STR, sizeof (PATH_SEP_STR) - 1);
++ t += sizeof (PATH_SEP_STR) - 1;
++ memcpy (t, path, pseg);
++ t += pseg;
++ *t = '\0';
+
+ for (ent = root->subdir; ent != NULL; ent = ent->next)
+ if (strlen (ent->name) == pseg && (!strncmp (ent->name, path, pseg)))
+@@ -375,21 +378,31 @@
+
+ /* Convert absolute paths to relative ones */
+ if (*linkname == PATH_SEP) {
+- char *p, *q;
++ char *p, *q, *r, *end;
+
+ for (p = path, q = entry->ino->linkname; *p == *q; p++, q++);
+ while (*(--q) != PATH_SEP);
+ q++;
++ r = buf;
++ end = buf + MC_MAXPATHLEN;
+ for (;; p++) {
+ p = strchr (p, PATH_SEP);
+ if (!p) {
+- strcat (buf, q);
++ size_t len = strlen (q);
++
++ if (r + len >= end)
++ break;
++
++ memcpy (r, q, len + 1);
++ linkname = buf;
+ break;
+ }
+- strcat (buf, "..");
+- strcat (buf, PATH_SEP_STR);
++
++ if (r + sizeof (".." PATH_SEP_STR) > end)
++ break;
++ memcpy (r, ".." PATH_SEP_STR, sizeof (".." PATH_SEP_STR) - 1);
++ r += sizeof (".." PATH_SEP_STR) - 1;
+ }
+- linkname = buf;
+ }
+
+ return (MEDATA->find_entry) (me, entry->dir, linkname, follow - 1, 0);
+@@ -622,8 +635,7 @@
+ return NULL;
+
+ if (info->cur->name) {
+- strncpy(dir.dent.d_name, info->cur->name, MC_MAXPATHLEN);
+- dir.dent.d_name[MC_MAXPATHLEN] = 0;
++ g_strlcpy(dir.dent.d_name, info->cur->name, MC_MAXPATHLEN);
+ } else {
+ vfs_die("Null in structure-cannot happen");
+ }
+@@ -729,8 +741,7 @@
+ if (ino->linkname == NULL)
+ ERRNOR (EFAULT, -1);
+
+- strncpy (buf, ino->linkname, size);
+- *(buf+size-1) = 0;
++ g_strlcpy (buf, ino->linkname, size);
+ return strlen (buf);
+ }
+
+@@ -1037,7 +1048,7 @@
+ struct vfs_s_inode *ino;
+ char buf[MC_MAXPATHLEN];
+
+- strncpy (buf, path, MC_MAXPATHLEN);
++ g_strlcpy (buf, path, MC_MAXPATHLEN);
+ ino = vfs_s_inode_from_path (me, path, FL_FOLLOW | FL_NONE);
+
+ if (!ino->localname)