(setstr): Fix for NSC_STRINGY without terminating zero.

This commit is contained in:
Markus Armbruster 2006-02-13 07:06:47 +00:00
parent 4ff857507e
commit 6ed05a024c

View file

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