]> git.pond.sub.org Git - empserver/commitdiff
(setstr): Fix for NSC_STRINGY without terminating zero.
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 13 Feb 2006 07:06:47 +0000 (07:06 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Mon, 13 Feb 2006 07:06:47 +0000 (07:06 +0000)
src/lib/common/xundump.c

index 5154aa3880be8c2a43034f30d6a5bac0d36aba3b..c43bc4632043c1a9470e8e8a7f0ec6c921cdf5f6 100644 (file)
@@ -390,6 +390,7 @@ setstr(int fldno, char *str)
 {
     struct castr *ca;
     int idx;
 {
     struct castr *ca;
     int idx;
+    size_t len;
     char *memb_ptr, *old;
 
     ca = getfld(fldno, &idx);
     char *memb_ptr, *old;
 
     ca = getfld(fldno, &idx);
@@ -403,26 +404,29 @@ setstr(int fldno, char *str)
        old = ((char **)memb_ptr)[idx];
        if (!(ca->ca_flags & NSC_CONST))
            ((char **)memb_ptr)[idx] = str ? strdup(str) : NULL;
        old = ((char **)memb_ptr)[idx];
        if (!(ca->ca_flags & NSC_CONST))
            ((char **)memb_ptr)[idx] = str ? strdup(str) : NULL;
+       len = 65535;            /* really SIZE_MAX, but it's C99 */
        break;
     case NSC_STRINGY:
        if (CANT_HAPPEN(idx))
            return -1;
        if (!str)
            return gripe("Field doesn't take nil");
        break;
     case NSC_STRINGY:
        if (CANT_HAPPEN(idx))
            return -1;
        if (!str)
            return gripe("Field doesn't take nil");
-       if (strlen(str) > ca->ca_len)
+       len = ca->ca_len;
+       if (strlen(str) > len)
            return gripe("Field %d takes at most %d characters",
            return gripe("Field %d takes at most %d characters",
-                        fldno + 1, ca->ca_len);
+                        fldno + 1, len);
        old = memb_ptr;
        if (!(ca->ca_flags & NSC_CONST))
        old = memb_ptr;
        if (!(ca->ca_flags & NSC_CONST))
-           strncpy(memb_ptr, str, ca->ca_len);
+           strncpy(memb_ptr, str, len);
        break;
     default:
        return gripe("Field %d doesn't take strings", fldno + 1);
     }
 
     if (ca->ca_flags & NSC_CONST) {
        break;
     default:
        return gripe("Field %d doesn't take strings", fldno + 1);
     }
 
     if (ca->ca_flags & NSC_CONST) {
-       if (old && (!str || strcmp(old, str)))
-           return gripe("Value for field %d must be \"%s\"", fldno + 1, old);
+       if (old && (!str || strncmp(old, str, len)))
+           return gripe("Value for field %d must be \"%.*s\"",
+                        fldno + 1, len, old);
        if (!old && str)
            return gripe("Value for field %d must be nil", fldno + 1);
     }
        if (!old && str)
            return gripe("Value for field %d must be nil", fldno + 1);
     }