Sebastian Kuschel reports that pfd_closing can be called for a socket
[u/mdw/putty] / conf.c
diff --git a/conf.c b/conf.c
index 3268449..e80f585 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -43,8 +43,8 @@ struct value {
     union {
        int intval;
        char *stringval;
-       Filename fileval;
-       FontSpec fontval;
+       Filename *fileval;
+       FontSpec *fontval;
     } u;
 };
 
@@ -125,6 +125,10 @@ static void free_value(struct value *val, int type)
 {
     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);
 }
 
 /*
@@ -141,10 +145,10 @@ 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.fileval = from->u.fileval;
+       to->u.fileval = filename_copy(from->u.fileval);
        break;
       case TYPE_FONT:
-       to->u.fontval = from->u.fontval;
+       to->u.fontval = fontspec_copy(from->u.fontval);
        break;
     }
 }
@@ -330,7 +334,7 @@ Filename *conf_get_filename(Conf *conf, int primary)
     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)
@@ -343,7 +347,7 @@ FontSpec *conf_get_fontspec(Conf *conf, int primary)
     key.primary = primary;
     entry = find234(conf->tree, &key, NULL);
     assert(entry);
-    return &entry->value.u.fontval;
+    return entry->value.u.fontval;
 }
 
 void conf_set_int(Conf *conf, int primary, int value)
@@ -416,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;
-    entry->value.u.fileval = *value;   /* structure copy */
+    entry->value.u.fileval = filename_copy(value);
     conf_insert(conf, entry);
 }
 
@@ -427,7 +431,7 @@ void conf_set_fontspec(Conf *conf, int primary, const FontSpec *value)
     assert(subkeytypes[primary] == TYPE_NONE);
     assert(valuetypes[primary] == TYPE_FONT);
     entry->key.primary = primary;
-    entry->value.u.fontval = *value;   /* structure copy */
+    entry->value.u.fontval = fontspec_copy(value);
     conf_insert(conf, entry);
 }
 
@@ -455,10 +459,10 @@ int conf_serialised_size(Conf *conf)
            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 += sizeof(entry->value.u.fontval);
+           size += fontspec_serialise(entry->value.u.fontval, NULL);
            break;
        }
     }
@@ -502,14 +506,10 @@ void conf_serialise(Conf *conf, void *vdata)
            *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:
-           memcpy(data, &entry->value.u.fontval,
-                  sizeof(entry->value.u.fontval));
-           data += sizeof(entry->value.u.fontval);
+            data += fontspec_serialise(entry->value.u.fontval, data);
            break;
        }
     }
@@ -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;
-    int primary;
+    unsigned primary;
+    int used;
     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);
@@ -541,7 +542,7 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize)
                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:
@@ -564,7 +565,7 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize)
                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:
@@ -580,28 +581,28 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize)
            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;
            }
-           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:
-           if (maxsize < sizeof(entry->value.u.fontval)) {
+            entry->value.u.fontval =
+                fontspec_deserialise(data, maxsize, &used);
+            if (!entry->value.u.fontval) {
                if (subkeytypes[entry->key.primary] == TYPE_STR)
                    sfree(entry->key.secondary.s);
                sfree(entry);
                goto done;
            }
-           memcpy(&entry->value.u.fontval, data,
-                  sizeof(entry->value.u.fontval));
-           data += sizeof(entry->value.u.fontval);
-           maxsize -= sizeof(entry->value.u.fontval);
+           data += used;
+           maxsize -= used;
            break;
        }
        conf_insert(conf, entry);