projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Avoid trying to take the modular inverse of zero in response to a
[u/mdw/putty]
/
conf.c
diff --git
a/conf.c
b/conf.c
index
e3ce258
..
e80f585
100644
(file)
--- a/
conf.c
+++ b/
conf.c
@@
-43,7
+43,7
@@
struct value {
union {
int intval;
char *stringval;
union {
int intval;
char *stringval;
- Filename fileval;
+ Filename
*
fileval;
FontSpec *fontval;
} u;
};
FontSpec *fontval;
} u;
};
@@
-125,6
+125,8
@@
static void free_value(struct value *val, int type)
{
if (type == TYPE_STR)
sfree(val->u.stringval);
{
if (type == TYPE_STR)
sfree(val->u.stringval);
+ else if (type == TYPE_FILENAME)
+ filename_free(val->u.fileval);
else if (type == TYPE_FONT)
fontspec_free(val->u.fontval);
}
else if (type == TYPE_FONT)
fontspec_free(val->u.fontval);
}
@@
-143,7
+145,7
@@
static void copy_value(struct value *to, struct value *from, int type)
to->u.stringval = dupstr(from->u.stringval);
break;
case TYPE_FILENAME:
to->u.stringval = dupstr(from->u.stringval);
break;
case TYPE_FILENAME:
- to->u.fileval = f
rom->u.fileval
;
+ to->u.fileval = f
ilename_copy(from->u.fileval)
;
break;
case TYPE_FONT:
to->u.fontval = fontspec_copy(from->u.fontval);
break;
case TYPE_FONT:
to->u.fontval = fontspec_copy(from->u.fontval);
@@
-332,7
+334,7
@@
Filename *conf_get_filename(Conf *conf, int primary)
key.primary = primary;
entry = find234(conf->tree, &key, NULL);
assert(entry);
key.primary = primary;
entry = find234(conf->tree, &key, NULL);
assert(entry);
- return
&
entry->value.u.fileval;
+ return entry->value.u.fileval;
}
FontSpec *conf_get_fontspec(Conf *conf, int primary)
}
FontSpec *conf_get_fontspec(Conf *conf, int primary)
@@
-418,7
+420,7
@@
void conf_set_filename(Conf *conf, int primary, const Filename *value)
assert(subkeytypes[primary] == TYPE_NONE);
assert(valuetypes[primary] == TYPE_FILENAME);
entry->key.primary = primary;
assert(subkeytypes[primary] == TYPE_NONE);
assert(valuetypes[primary] == TYPE_FILENAME);
entry->key.primary = primary;
- entry->value.u.fileval =
*value; /* structure copy */
+ entry->value.u.fileval =
filename_copy(value);
conf_insert(conf, entry);
}
conf_insert(conf, entry);
}
@@
-457,7
+459,7
@@
int conf_serialised_size(Conf *conf)
size += 1 + strlen(entry->value.u.stringval);
break;
case TYPE_FILENAME:
size += 1 + strlen(entry->value.u.stringval);
break;
case TYPE_FILENAME:
- size +=
sizeof(entry->value.u.fileval
);
+ size +=
filename_serialise(entry->value.u.fileval, NULL
);
break;
case TYPE_FONT:
size += fontspec_serialise(entry->value.u.fontval, NULL);
break;
case TYPE_FONT:
size += fontspec_serialise(entry->value.u.fontval, NULL);
@@
-504,9
+506,7
@@
void conf_serialise(Conf *conf, void *vdata)
*data++ = 0;
break;
case TYPE_FILENAME:
*data++ = 0;
break;
case TYPE_FILENAME:
- memcpy(data, &entry->value.u.fileval,
- sizeof(entry->value.u.fileval));
- data += sizeof(entry->value.u.fileval);
+ data += filename_serialise(entry->value.u.fileval, data);
break;
case TYPE_FONT:
data += fontspec_serialise(entry->value.u.fontval, data);
break;
case TYPE_FONT:
data += fontspec_serialise(entry->value.u.fontval, data);
@@
-522,14
+522,15
@@
int conf_deserialise(Conf *conf, void *vdata, int maxsize)
unsigned char *data = (unsigned char *)vdata;
unsigned char *start = data;
struct conf_entry *entry;
unsigned char *data = (unsigned char *)vdata;
unsigned char *start = data;
struct conf_entry *entry;
- int primary, used;
+ unsigned primary;
+ int used;
unsigned char *zero;
while (maxsize >= 4) {
primary = GET_32BIT_MSB_FIRST(data);
data += 4, maxsize -= 4;
unsigned char *zero;
while (maxsize >= 4) {
primary = GET_32BIT_MSB_FIRST(data);
data += 4, maxsize -= 4;
- if (
(unsigned)
primary >= N_CONFIG_OPTIONS)
+ if (primary >= N_CONFIG_OPTIONS)
break;
entry = snew(struct conf_entry);
break;
entry = snew(struct conf_entry);
@@
-541,7
+542,7
@@
int conf_deserialise(Conf *conf, void *vdata, int maxsize)
sfree(entry);
goto done;
}
sfree(entry);
goto done;
}
- entry->key.secondary.i =
GET_32BIT_MSB_FIRST(data
);
+ entry->key.secondary.i =
toint(GET_32BIT_MSB_FIRST(data)
);
data += 4, maxsize -= 4;
break;
case TYPE_STR:
data += 4, maxsize -= 4;
break;
case TYPE_STR:
@@
-564,7
+565,7
@@
int conf_deserialise(Conf *conf, void *vdata, int maxsize)
sfree(entry);
goto done;
}
sfree(entry);
goto done;
}
- entry->value.u.intval =
GET_32BIT_MSB_FIRST(data
);
+ entry->value.u.intval =
toint(GET_32BIT_MSB_FIRST(data)
);
data += 4, maxsize -= 4;
break;
case TYPE_STR:
data += 4, maxsize -= 4;
break;
case TYPE_STR:
@@
-580,16
+581,16
@@
int conf_deserialise(Conf *conf, void *vdata, int maxsize)
data = zero + 1;
break;
case TYPE_FILENAME:
data = zero + 1;
break;
case TYPE_FILENAME:
- if (maxsize < sizeof(entry->value.u.fileval)) {
+ entry->value.u.fileval =
+ filename_deserialise(data, maxsize, &used);
+ if (!entry->value.u.fileval) {
if (subkeytypes[entry->key.primary] == TYPE_STR)
sfree(entry->key.secondary.s);
sfree(entry);
goto done;
}
if (subkeytypes[entry->key.primary] == TYPE_STR)
sfree(entry->key.secondary.s);
sfree(entry);
goto done;
}
- memcpy(&entry->value.u.fileval, data,
- sizeof(entry->value.u.fileval));
- data += sizeof(entry->value.u.fileval);
- maxsize -= sizeof(entry->value.u.fileval);
+ data += used;
+ maxsize -= used;
break;
case TYPE_FONT:
entry->value.u.fontval =
break;
case TYPE_FONT:
entry->value.u.fontval =