Author: nkinder
Update of /cvs/dirsec/adminserver/admserv/cgi-src40
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv1999
Modified Files:
security.c
Log Message:
Resolves: 370071
Summary: Fixed issues with loading CRL files.
Index: security.c
===================================================================
RCS file: /cvs/dirsec/adminserver/admserv/cgi-src40/security.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- security.c 31 Oct 2007 05:30:53 -0000 1.12
+++ security.c 14 Nov 2007 23:42:43 -0000 1.13
@@ -93,8 +93,10 @@
#define FOOTER "-----END CERTIFICATE-----"
#define HEADERREQUEST "-----BEGIN %s CERTIFICATE REQUEST-----\n"
#define FOOTERREQUEST "\n-----END %s CERTIFICATE REQUEST-----\n"
-#define CRLHEADER "-----BEGIN X509 CRL-----"
-#define CRLFOOTER "-----END X509 CRL-----"
+#define X509CRLHEADER "-----BEGIN X509 CRL-----"
+#define X509CRLFOOTER "-----END X509 CRL-----"
+#define CRLHEADER "-----BEGIN CERTIFICATE REVOCATION LIST-----\n"
+#define CRLFOOTER "-----END CERTIFICATE REVOCATION LIST-----\n"
/*#else
#define HEADER "-----BEGIN CERTIFICATE----\n"
#define FOOTER "\n-----END CERTIFICATE-----\n"
@@ -1494,6 +1496,7 @@
SECItem derCrl;
char msg[BIG_LINE];
char *secdir = util_get_security_dir();
+ char full_path[PATH_MAX];
int list_type = (type && !PORT_Strcmp(type, "CKL"))? SEC_KRL_TYPE :
SEC_CRL_TYPE;
if (!filename || !*filename ||
@@ -1506,9 +1509,12 @@
{/*try open the file*/
FILE *f;
+
+ PR_snprintf(full_path, sizeof(full_path), "%s%c%s", secdir, FILE_PATHSEP,
filename);
+ form_unescape(full_path);
- if( !(f = fopen(filename, "rb")) ) {
- PR_snprintf(msg, sizeof(msg), getResourceString(DBT_NO_FILE_EXISTS), filename);
+ if( !(f = fopen(full_path, "rb")) ) {
+ PR_snprintf(msg, sizeof(msg), getResourceString(DBT_NO_FILE_EXISTS), full_path);
errorRpt(FILE_ERROR, msg);
} else {
int size;
@@ -1543,23 +1549,36 @@
ascii text file.
*/
{
+ int headerlen = 0;
char *DERCert = NULL;
char* begin = (char*) PORT_Strstr((const char*)ascii, CRLHEADER);
char* end = (char*) PORT_Strstr((const char*)ascii, CRLFOOTER);
+ /* Check for the alternate CRL header and footer format */
+ if (begin == NULL) {
+ begin = (char*) PORT_Strstr((const char*)ascii, X509CRLHEADER);
+ headerlen = strlen(X509CRLHEADER);
+ } else {
+ headerlen = strlen(CRLHEADER);
+ }
+
+ if (end == NULL) {
+ end = (char*) PORT_Strstr((const char*)ascii, X509CRLFOOTER);
+ }
+
if ((begin != NULL) && (end != NULL)) {
- end += PORT_Strlen(FOOTER);
+ /* chop the footer off */
*end = '\0';
- DERCert = (char*)PORT_ZAlloc(PORT_Strlen(begin));
-
- strcpy(DERCert, begin+strlen(CRLHEADER));
+ /* don't copy the header */
+ DERCert = (char*)PORT_ZAlloc(PORT_Strlen(begin - headerlen + 1));
+ strcpy(DERCert, (begin + headerlen));
if ( SECFailure == ATOB_ConvertAsciiToItem(&derCrl, DERCert) ) {
errorRpt(SYSTEM_ERROR, getResourceString(DBT_DECODE_CRL_ERROR));
}
} else {
- PR_snprintf(msg, sizeof(msg), getResourceString(DBT_INVALID_CRL), filename);
+ PR_snprintf(msg, sizeof(msg), getResourceString(DBT_INVALID_CRL), full_path);
errorRpt(FILE_ERROR, msg);
}
}
Show replies by date