if (!cc)
         return EINVAL;
 
-    if (err_format == NULL) {
-        return EINVAL;
+    if (err_format == NULL || err_format[0] == '\0') {
+        goto wo_msg;
     }
 
     va_start(ap, err_format);
         va_end(ap);
         return EINVAL;
     }
+    va_end(ap);
 
     ret = resolve_error_code(cc, err_code, err_orig);
+wo_msg:
     update_error_msg(cc, new_msg);
-    free(new_msg);
-    va_end(ap);
+    if (new_msg)
+        free(new_msg);
 
-    return ret; 
+    return ret;
 }
 
 /* If there was some error message in ctx, delete it and make new */
     }
     
     new_error[0] = '\0';
-    strncpy(new_error, new_msg, err_new_msg_len + 1);
-    strncat(new_error, separ, separ_len + 1);
+    if (new_msg) {
+        strncpy(new_error, new_msg, err_new_msg_len + 1);
+        strncat(new_error, separ, separ_len + 1);
+    }
     strncat(new_error, code_str, code_len + 1);
     strncat(new_error, separ, separ_len + 1);
     if (ctx->err_msg) {