Check if the buffer is in error state and report an error if it is.
This replaces the pattern:
if (virBufferError(buf)) {
virReportOOMError();
goto cleanup;
}
with:
if (virBufferCheckError(buf) < 0)
goto cleanup;
Document typical buffer usage to favor this.
Also remove the redundant FreeAndReset - if an error has
been set via virBufferSetError, the content is already freed.
=============================
If there is a need for complex string concatenations, avoid using the usual
sequence of malloc/strcpy/strcat/snprintf functions and make use of the
-virBuffer API described in buf.h
+virBuffer API described in virbuffer.h
Typical usage is as follows:
...
- if (virBufferError(&buf)) {
- virBufferFreeAndReset(&buf);
- virReportOOMError();
+ if (virBufferCheckError(&buf) < 0)
return NULL;
- }
return virBufferContentAndReset(&buf);
}
<p>
If there is a need for complex string concatenations, avoid using
the usual sequence of malloc/strcpy/strcat/snprintf functions and
- make use of the virBuffer API described in buf.h
+ make use of the virBuffer API described in virbuffer.h
</p>
<p>Typical usage is as follows:</p>
...
- if (virBufferError(&buf)) {
- virBufferFreeAndReset(&buf);
- virReportOOMError();
+ if (virBufferCheckError(&buf) < 0)
return NULL;
- }
return virBufferContentAndReset(&buf);
}
src/util/virauth.c
src/util/virauthconfig.c
src/util/virbitmap.c
+src/util/virbuffer.c
src/util/vircgroup.c
src/util/virclosecallbacks.c
src/util/vircommand.c
virBufferAddChar;
virBufferAdjustIndent;
virBufferAsprintf;
+virBufferCheckErrorInternal;
virBufferContentAndReset;
virBufferCurrentContent;
virBufferError;
#include "virbuffer.h"
#include "viralloc.h"
+#include "virerror.h"
/* If adding more fields, ensure to edit buf.h to match
return buf->error;
}
+/**
+ * virBufferCheckErrorInternal:
+ * @buf: the buffer
+ *
+ * Report an error if the buffer is in an error state.
+ *
+ * Return -1 if an error has been reported, 0 otherwise.
+ */
+int
+virBufferCheckErrorInternal(const virBuffer *buf,
+ int domcode,
+ const char *filename,
+ const char *funcname,
+ size_t linenr)
+{
+ if (buf->error == 0)
+ return 0;
+
+ if (buf->error == ENOMEM) {
+ virReportOOMErrorFull(domcode, filename, funcname, linenr);
+ errno = ENOMEM;
+ } else {
+ virReportErrorHelper(domcode, VIR_ERR_INTERNAL_ERROR, filename,
+ funcname, linenr, "%s",
+ _("Invalid buffer API usage"));
+ errno = EINVAL;
+ }
+ return -1;
+}
+
/**
* virBufferUse:
* @buf: the usage of the string in the buffer
char *virBufferContentAndReset(virBufferPtr buf);
void virBufferFreeAndReset(virBufferPtr buf);
int virBufferError(const virBuffer *buf);
+int virBufferCheckErrorInternal(const virBuffer *buf,
+ int domcode,
+ const char *filename,
+ const char *funcname,
+ size_t linenr)
+ ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1);
+/**
+ * virBufferCheckError
+ *
+ * Checks if the buffer is in error state and reports an error.
+ *
+ * Returns 0 if no error has occured, otherwise an error is reported
+ * and -1 is returned.
+ */
+# define virBufferCheckError(buf) \
+ virBufferCheckErrorInternal(buf, VIR_FROM_THIS, __FILE__, __FUNCTION__, \
+ __LINE__)
unsigned int virBufferUse(const virBuffer *buf);
void virBufferAdd(virBufferPtr buf, const char *str, int len);
void virBufferAddChar(virBufferPtr buf, char c);