use calloc_a for interface error allocations
[project/netifd.git] / interface.c
index fddb861..352c734 100644 (file)
@@ -79,8 +79,7 @@ void interface_add_error(struct interface *iface, const char *subsystem,
        struct interface_error *error;
        int i, len = 0;
        int *datalen = NULL;
-       char *dest;
-       int subsystem_len = 0, code_len = 0;
+       char *dest, *d_subsys, *d_code;
 
        if (n_data) {
                len = n_data * sizeof(char *);
@@ -91,17 +90,9 @@ void interface_add_error(struct interface *iface, const char *subsystem,
                }
        }
 
-       if (subsystem) {
-               subsystem_len = strlen(subsystem) + 1;
-               len += subsystem_len;
-       }
-
-       if (code) {
-               code_len = strlen(code) + 1;
-               len += code_len;
-       }
-
-       error = calloc(1, sizeof(*error) + sizeof(char *) + len);
+       error = calloc_a(sizeof(*error) + sizeof(char *) + len,
+               &d_subsys, subsystem ? strlen(subsystem) + 1 : 0,
+               &d_code, code ? strlen(code) + 1 : 0);
        if (!error)
                return;
 
@@ -115,18 +106,11 @@ void interface_add_error(struct interface *iface, const char *subsystem,
        }
        error->data[n_data++] = NULL;
 
-       dest = (char *) &error->data[n_data];
-       if (subsystem) {
-               error->subsystem = dest;
-               strcpy(dest, subsystem);
-               dest += subsystem_len;
-       }
+       if (subsystem)
+               error->subsystem = strcpy(d_subsys, subsystem);
 
-       if (code) {
-               error->code = dest;
-               strcpy(dest, code);
-               dest += code_len;
-       }
+       if (code)
+               error->code = strcpy(d_code, code);
 }
 
 static void
@@ -214,8 +198,6 @@ mark_interface_down(struct interface *iface)
 void
 __interface_set_down(struct interface *iface, bool force)
 {
-       interface_clear_errors(iface);
-
        if (iface->state == IFS_DOWN ||
                iface->state == IFS_TEARDOWN)
                return;