|
From: Chris B. <buc...@us...> - 2012-03-29 21:19:47
|
Update of /cvsroot/sblim/sfcb
In directory vz-cvs-3.sog:/tmp/cvs-serv21543
Modified Files:
providerDrv.c ChangeLog NEWS
Log Message:
[ 3408288 ] Safer Signal Handlers
Index: NEWS
===================================================================
RCS file: /cvsroot/sblim/sfcb/NEWS,v
retrieving revision 1.671
retrieving revision 1.672
diff -u -d -r1.671 -r1.672
--- NEWS 29 Mar 2012 14:39:53 -0000 1.671
+++ NEWS 29 Mar 2012 21:19:43 -0000 1.672
@@ -62,6 +62,7 @@
- 3510458 Malformed XML response to GetProperty
- 3510456 GetProperty calls not passing keys to providers
- 3505407 Client openlog changes settings
+- 3408288 Safer Signal Handlers
Changes in 1.3.13
=================
Index: providerDrv.c
===================================================================
RCS file: /cvsroot/sblim/sfcb/providerDrv.c,v
retrieving revision 1.112
retrieving revision 1.113
diff -u -d -r1.112 -r1.113
--- providerDrv.c 29 Mar 2012 15:39:33 -0000 1.112
+++ providerDrv.c 29 Mar 2012 21:19:43 -0000 1.113
@@ -169,6 +169,9 @@
extern void sunsetControl();
extern void uninitGarbageCollector();
+static BinResponseHdr *err_crash_resp; /* holds generic "we crashed" response */
+static long ecr_len;
+static long makeSafeResponse(BinResponseHdr *hdr, BinResponseHdr **out);
typedef struct parms {
int requestor;
@@ -437,17 +440,13 @@
static void handleSigSegv(int sig)
{
Parms *threads=activeThreadsFirst;
- char msg[1024];
- BinResponseHdr *resp;
-
+ int dmy = -1;
+
mlogf(M_ERROR,M_SHOW, "-#- %s - %d provider exiting due to a SIGSEGV signal\n",
processName, currentProc);
while (threads) {
- snprintf(msg,1023, "*** Provider %s(%d) exiting due to a SIGSEGV signal",
- threads->pInfo->providerName, currentProc);
- resp = errorCharsResp(CMPI_RC_ERR_FAILED, msg);
- sendResponse(threads->requestor, resp);
- threads=threads->next;
+ spSendResult(&threads->requestor, &dmy, err_crash_resp, ecr_len);
+ threads=threads->next;
}
}
@@ -870,6 +869,13 @@
_SFCB_ABORT();
}
+ char msg[1024];
+ snprintf(msg,1023, "*** Provider %s(%d) exiting due to a SIGSEGV signal",
+ processName, currentProc);
+ BinResponseHdr* buf = errorCharsResp(CMPI_RC_ERR_FAILED, msg);
+
+ ecr_len = makeSafeResponse(buf, &err_crash_resp);
+
processProviderInvocationRequests(info->providerName);
_SFCB_RETURN(0);
}
@@ -979,122 +985,130 @@
BinResponseHdr *(*handler) (BinRequestHdr *, ProviderInfo * info, int requestor);
} ProvHandler;
+static long makeSafeResponse(BinResponseHdr* hdr, BinResponseHdr** out) {
-static int sendResponse(int requestor, BinResponseHdr * hdr)
-{
- _SFCB_ENTER(TRACE_PROVIDERDRV, "sendResponse");
- int i, rvl=0, ol, size, dmy=-1;
- long l;
- char str_time[26];
- BinResponseHdr *buf;
-
- size = sizeof(BinResponseHdr) + ((hdr->count - 1) * sizeof(MsgSegment));
+ int i, rvl=0, ol, size;
+ long len;
+ char str_time[26];
+ BinResponseHdr *outHdr = NULL;
- if (hdr->rvValue) {
- switch(hdr->rv.type) {
- case CMPI_string:
- if (hdr->rv.value.string) {
- if (hdr->rv.value.string->hdl) {
- hdr->rv.value.string= hdr->rv.value.string->hdl;
- }
- else hdr->rv.value.string=NULL;
- }
- hdr->rv.type=CMPI_chars;
- /* note: a break statement is NOT missing here... */
- case CMPI_chars:
- hdr->rvEnc=setCharsMsgSegment((char*)hdr->rv.value.string);
- rvl=hdr->rvEnc.length;
- break;
- case CMPI_dateTime:
- dateTime2chars(hdr->rv.value.dateTime, NULL, str_time);
- hdr->rvEnc.type=MSG_SEG_CHARS;
- hdr->rvEnc.length=rvl=26;
- hdr->rvEnc.data=&str_time;
- break;
- case CMPI_ref:
- mlogf(M_ERROR,M_SHOW,"-#- not supporting refs\n");
- abort();
- default: ;
+ size = sizeof(BinResponseHdr) + ((hdr->count - 1) * sizeof(MsgSegment));
+
+ if (hdr->rvValue) {
+ switch(hdr->rv.type) {
+ case CMPI_string:
+ if (hdr->rv.value.string) {
+ if (hdr->rv.value.string->hdl) {
+ hdr->rv.value.string= hdr->rv.value.string->hdl;
+ }
+ else hdr->rv.value.string=NULL;
}
- }
+ hdr->rv.type=CMPI_chars;
+ /* note: a break statement is NOT missing here... */
+ case CMPI_chars:
+ hdr->rvEnc=setCharsMsgSegment((char*)hdr->rv.value.string);
+ rvl=hdr->rvEnc.length;
+ break;
+ case CMPI_dateTime:
+ dateTime2chars(hdr->rv.value.dateTime, NULL, str_time);
+ hdr->rvEnc.type=MSG_SEG_CHARS;
+ hdr->rvEnc.length=rvl=26;
+ hdr->rvEnc.data=&str_time;
+ break;
+ case CMPI_ref:
+ mlogf(M_ERROR,M_SHOW,"-#- not supporting refs\n");
+ abort();
+ default: ;
+ }
+ }
- for (l = size, i = 0; i < hdr->count; i++) {
- /* add padding length to calculation */
- l += (hdr->object[i].type == MSG_SEG_CHARS ? PADDED_LEN(hdr->object[i].length) : hdr->object[i].length);
- }
+ for (len = size, i = 0; i < hdr->count; i++) {
+ /* add padding length to calculation */
+ len += (hdr->object[i].type == MSG_SEG_CHARS ? PADDED_LEN(hdr->object[i].length) : hdr->object[i].length);
+ }
- buf = (BinResponseHdr *) malloc(l +rvl + 8);
- memcpy(buf, hdr, size);
+ outHdr = malloc(len +rvl + 8);
+ memcpy(outHdr, hdr, size);
- if (rvl) {
- ol = hdr->rvEnc.length;
- l=size;
- switch (hdr->rvEnc.type) {
- case MSG_SEG_CHARS:
- memcpy(((char *) buf) + l, hdr->rvEnc.data, ol);
- buf->rvEnc.data = (void *) l;
- l += ol;
- break;
- }
- size=l;
- }
+ if (rvl) {
+ ol = hdr->rvEnc.length;
+ len=size;
+ switch (hdr->rvEnc.type) {
+ case MSG_SEG_CHARS:
+ memcpy(((char *) outHdr) + len, hdr->rvEnc.data, ol);
+ outHdr->rvEnc.data = (void *) len;
+ len += ol;
+ break;
+ }
+ size=len;
+ }
- for (l = size, i = 0; i < hdr->count; i++) {
- ol = hdr->object[i].length;
- switch (hdr->object[i].type) {
- case MSG_SEG_OBJECTPATH:
- getSerializedObjectPath((CMPIObjectPath *) hdr->object[i].data,
- ((char *) buf) + l);
- buf->object[i].data = (void *) l;
- l += ol;
- break;
- case MSG_SEG_INSTANCE:
- getSerializedInstance((CMPIInstance *) hdr->object[i].data,
- ((char *) buf) + l);
- buf->object[i].data = (void *) l;
- l += ol;
- break;
- case MSG_SEG_CHARS:
- memcpy(((char *) buf) + l, hdr->object[i].data, ol);
- buf->object[i].data = (void *) l;
- buf->object[i].length = PADDED_LEN(ol);
- l += buf->object[i].length;
- break;
- case MSG_SEG_CONSTCLASS:
- getSerializedConstClass((CMPIConstClass *) hdr->object[i].data,
- ((char *) buf) + l);
- buf->object[i].data = (void *) l;
- l += ol;
- break;
- case MSG_SEG_ARGS:
- getSerializedArgs((CMPIArgs *) hdr->object[i].data,
- ((char *) buf) + l);
- buf->object[i].data = (void *) l;
- l += ol;
- break;
+ for (len = size, i = 0; i < hdr->count; i++) {
+ ol = hdr->object[i].length;
+ switch (hdr->object[i].type) {
+ case MSG_SEG_OBJECTPATH:
+ getSerializedObjectPath((CMPIObjectPath *) hdr->object[i].data,
+ ((char *) outHdr) + len);
+ outHdr->object[i].data = (void *) len;
+ len += ol;
+ break;
+ case MSG_SEG_INSTANCE:
+ getSerializedInstance((CMPIInstance *) hdr->object[i].data,
+ ((char *) outHdr) + len);
+ outHdr->object[i].data = (void *) len;
+ len += ol;
+ break;
+ case MSG_SEG_CHARS:
+ memcpy(((char *) outHdr) + len, hdr->object[i].data, ol);
+ outHdr->object[i].data = (void *) len;
+ outHdr->object[i].length = PADDED_LEN(ol);
+ len += outHdr->object[i].length;
+ break;
+ case MSG_SEG_CONSTCLASS:
+ getSerializedConstClass((CMPIConstClass *) hdr->object[i].data,
+ ((char *) outHdr) + len);
+ outHdr->object[i].data = (void *) len;
+ len += ol;
+ break;
+ case MSG_SEG_ARGS:
+ getSerializedArgs((CMPIArgs *) hdr->object[i].data,
+ ((char *) outHdr) + len);
+ outHdr->object[i].data = (void *) len;
+ len += ol;
+ break;
#ifdef HAVE_QUALREP
- case MSG_SEG_QUALIFIER:
- getSerializedQualifier((CMPIQualifierDecl *) hdr->object[i].data,
- ((char *) buf) + l);
- buf->object[i].data = (void *) l;
- l += ol;
- break;
+ case MSG_SEG_QUALIFIER:
+ getSerializedQualifier((CMPIQualifierDecl *) hdr->object[i].data,
+ ((char *) outHdr) + len);
+ outHdr->object[i].data = (void *) len;
+ len += ol;
+ break;
#endif
- default:
- mlogf(M_ERROR,M_SHOW,"--- bad sendResponse request %d\n", hdr->object[i].type);
- _SFCB_ABORT();
- }
- }
+ default:
+ mlogf(M_ERROR,M_SHOW,"--- bad sendResponse request %d\n", hdr->object[i].type);
+ abort();
+ }
+ }
- _SFCB_TRACE(1, ("--- Sending result to %d-%lu",
- requestor,getInode(requestor)));
+ *out = outHdr;
+ return len;
+}
+
+static int sendResponse(int requestor, BinResponseHdr * hdr)
+{
+ _SFCB_ENTER(TRACE_PROVIDERDRV, "sendResponse");
+ int dmy=-1;
+ BinResponseHdr* buf = (void*)&dmy;
+ long l = makeSafeResponse(hdr, &buf);
+
+ _SFCB_TRACE(1, ("--- Sending result %p to %d-%lu size %lu",
+ buf, requestor,getInode(requestor), l));
spSendResult(&requestor, &dmy, buf, l);
free(buf);
_SFCB_RETURN(0);
}
-
int sendResponseChunk(CMPIArray *r,int requestor, CMPIType type)
{
int i, count;
Index: ChangeLog
===================================================================
RCS file: /cvsroot/sblim/sfcb/ChangeLog,v
retrieving revision 1.750
retrieving revision 1.751
diff -u -d -r1.750 -r1.751
--- ChangeLog 29 Mar 2012 14:39:53 -0000 1.750
+++ ChangeLog 29 Mar 2012 21:19:43 -0000 1.751
@@ -1,3 +1,8 @@
+2012-03-29 Chris Buccella <buc...@li...>
+
+ * providerDrv.c:
+ [ 3408288 ] Safer Signal Handlers
+
2012-03-29 Michael Chase-Salerno <br...@li...>
* cimcClientSfcbLocal.c:
|