]> granicus.if.org Git - ipset/commitdiff
Retry printing when sprintf fails (reported by Stig Thormodsrud)
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 22 Sep 2014 05:32:38 +0000 (07:32 +0200)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 22 Sep 2014 05:32:38 +0000 (07:32 +0200)
Instead of returning the length of the string which would have been
printed, sprintf sometimes simply returns an error code. Handle
the case and flush the printing buffer and retry.

lib/session.c

index cbef026796de03090a17c759a292852a96464911..da162b0aaec8f07231f96efb49ba146e57589bb3 100644 (file)
@@ -716,13 +716,7 @@ retry:
                        fmt, args);
        va_end(args);
 
-       if (ret < 0) {
-               ipset_err(session,
-                        "Internal error at printing to output buffer");
-               longjmp(printf_failure, 1);
-       }
-
-       if (ret >= IPSET_OUTBUFLEN - len) {
+       if (ret < 0 || ret >= IPSET_OUTBUFLEN - len) {
                /* Buffer was too small, push it out and retry */
                D("print buffer and try again: %u", len);
                if (loop++) {
@@ -750,13 +744,7 @@ retry:
        ret = fn(session->outbuf + len, IPSET_OUTBUFLEN - len,
                 session->data, opt, session->envopts);
 
-       if (ret < 0) {
-               ipset_err(session,
-                       "Internal error at printing to output buffer");
-               longjmp(printf_failure, 1);
-       }
-
-       if (ret >= IPSET_OUTBUFLEN - len) {
+       if (ret < 0 || ret >= IPSET_OUTBUFLEN - len) {
                /* Buffer was too small, push it out and retry */
                D("print buffer and try again: %u", len);
                if (loop++) {