#34 nsd/tclcrypto.c:3102: error: Null Dereference pointer `null` is dereferenced by call to `EncodedObj()` at line 3102, column 38. nsd/tclcrypto.c:3076:1: start of procedure NsTclCryptoRandomBytesObjCmd() 3074. *---------------------------------------------------------------------- 3075. */ 3076. int ^ 3077. NsTclCryptoRandomBytesObjCmd(ClientData UNUSED(clientData), Tcl_Interp *interp, int objc, Tcl_Obj *const* objv) 3078. { nsd/tclcrypto.c:3079:5: 3077. NsTclCryptoRandomBytesObjCmd(ClientData UNUSED(clientData), Tcl_Interp *interp, int objc, Tcl_Obj *const* objv) 3078. { 3079. int result, nrBytes = 0; ^ 3080. Ns_BinaryEncoding encoding = RESULT_ENCODING_HEX; 3081. Ns_ObjvValueRange lengthRange = {1, INT_MAX}; nsd/tclcrypto.c:3080:5: 3078. { 3079. int result, nrBytes = 0; 3080. Ns_BinaryEncoding encoding = RESULT_ENCODING_HEX; ^ 3081. Ns_ObjvValueRange lengthRange = {1, INT_MAX}; 3082. Ns_ObjvSpec lopts[] = { nsd/tclcrypto.c:3081:5: 3079. int result, nrBytes = 0; 3080. Ns_BinaryEncoding encoding = RESULT_ENCODING_HEX; 3081. Ns_ObjvValueRange lengthRange = {1, INT_MAX}; ^ 3082. Ns_ObjvSpec lopts[] = { 3083. {"-encoding", Ns_ObjvIndex, &encoding, binaryencodings}, nsd/tclcrypto.c:3082:5: 3080. Ns_BinaryEncoding encoding = RESULT_ENCODING_HEX; 3081. Ns_ObjvValueRange lengthRange = {1, INT_MAX}; 3082. Ns_ObjvSpec lopts[] = { ^ 3083. {"-encoding", Ns_ObjvIndex, &encoding, binaryencodings}, 3084. {NULL, NULL, NULL, NULL} nsd/tclcrypto.c:3086:5: 3084. {NULL, NULL, NULL, NULL} 3085. }; 3086. Ns_ObjvSpec args[] = { ^ 3087. {"bytes", Ns_ObjvInt, &nrBytes, &lengthRange}, 3088. {NULL, NULL, NULL, NULL} nsd/tclcrypto.c:3091:9: Taking false branch 3089. }; 3090. 3091. if (Ns_ParseObjv(lopts, args, interp, 1, objc, objv) != NS_OK) { ^ 3092. result = TCL_ERROR; 3093. nsd/tclcrypto.c:3098:9: Skipping Tcl_DStringInit(): method has no implementation 3096. int rc; 3097. 3098. Tcl_DStringInit(&ds); ^ 3099. Tcl_DStringSetLength(&ds, nrBytes); 3100. rc = RAND_bytes((unsigned char *)ds.string, nrBytes); nsd/tclcrypto.c:3099:9: Skipping Tcl_DStringSetLength(): method has no implementation 3097. 3098. Tcl_DStringInit(&ds); 3099. Tcl_DStringSetLength(&ds, nrBytes); ^ 3100. rc = RAND_bytes((unsigned char *)ds.string, nrBytes); 3101. if (likely(rc == 1)) { nsd/tclcrypto.c:3100:9: Skipping RAND_bytes(): method has no implementation 3098. Tcl_DStringInit(&ds); 3099. Tcl_DStringSetLength(&ds, nrBytes); 3100. rc = RAND_bytes((unsigned char *)ds.string, nrBytes); ^ 3101. if (likely(rc == 1)) { 3102. Tcl_SetObjResult(interp, EncodedObj((unsigned char *)ds.string, (size_t)nrBytes, NULL, encoding)); nsd/tclcrypto.c:3101:13: Condition is true 3099. Tcl_DStringSetLength(&ds, nrBytes); 3100. rc = RAND_bytes((unsigned char *)ds.string, nrBytes); 3101. if (likely(rc == 1)) { ^ 3102. Tcl_SetObjResult(interp, EncodedObj((unsigned char *)ds.string, (size_t)nrBytes, NULL, encoding)); 3103. result = TCL_OK; nsd/tclcrypto.c:3101:13: Taking true branch 3099. Tcl_DStringSetLength(&ds, nrBytes); 3100. rc = RAND_bytes((unsigned char *)ds.string, nrBytes); 3101. if (likely(rc == 1)) { ^ 3102. Tcl_SetObjResult(interp, EncodedObj((unsigned char *)ds.string, (size_t)nrBytes, NULL, encoding)); 3103. result = TCL_OK; nsd/tclcrypto.c:3102:13: 3100. rc = RAND_bytes((unsigned char *)ds.string, nrBytes); 3101. if (likely(rc == 1)) { 3102. Tcl_SetObjResult(interp, EncodedObj((unsigned char *)ds.string, (size_t)nrBytes, NULL, encoding)); ^ 3103. result = TCL_OK; 3104. } else { nsd/tclcrypto.c:198:1: start of procedure EncodedObj() 196. */ 197. 198. static Tcl_Obj* ^ 199. EncodedObj(unsigned char *octects, size_t octectLength, 200. char *outputBuffer, Ns_BinaryEncoding encoding) { nsd/tclcrypto.c:201:5: 199. EncodedObj(unsigned char *octects, size_t octectLength, 200. char *outputBuffer, Ns_BinaryEncoding encoding) { 201. char *origOutputBuffer = outputBuffer; ^ 202. Tcl_Obj *resultObj = NULL; /* enumeration is complete, quiet some older compilers */ 203. nsd/tclcrypto.c:202:5: 200. char *outputBuffer, Ns_BinaryEncoding encoding) { 201. char *origOutputBuffer = outputBuffer; 202. Tcl_Obj *resultObj = NULL; /* enumeration is complete, quiet some older compilers */ ^ 203. 204. NS_NONNULL_ASSERT(octects != NULL); nsd/tclcrypto.c:204:5: 202. Tcl_Obj *resultObj = NULL; /* enumeration is complete, quiet some older compilers */ 203. 204. NS_NONNULL_ASSERT(octects != NULL); ^ 205. 206. if (outputBuffer == NULL && encoding != RESULT_ENCODING_BINARY) { nsd/tclcrypto.c:206:9: Taking false branch 204. NS_NONNULL_ASSERT(octects != NULL); 205. 206. if (outputBuffer == NULL && encoding != RESULT_ENCODING_BINARY) { ^ 207. /* 208. * It is a safe assumption to double the size, since the hex nsd/tclcrypto.c:214:5: 212. } 213. 214. switch (encoding) { ^ 215. case RESULT_ENCODING_BINARY: 216. resultObj = Tcl_NewByteArrayObj(octects, (int)octectLength); nsd/tclcrypto.c:215:5: Switch condition is false. Skipping switch case 213. 214. switch (encoding) { 215. case RESULT_ENCODING_BINARY: ^ 216. resultObj = Tcl_NewByteArrayObj(octects, (int)octectLength); 217. break; nsd/tclcrypto.c:219:5: Switch condition is false. Skipping switch case 217. break; 218. 219. case RESULT_ENCODING_BASE64URL: ^ 220. hexPrint("result", octects, octectLength); 221. (void)Ns_HtuuEncode2(octects, octectLength, outputBuffer, 1); nsd/tclcrypto.c:225:5: Switch condition is false. Skipping switch case 223. break; 224. 225. case RESULT_ENCODING_BASE64: ^ 226. (void)Ns_HtuuEncode2(octects, octectLength, outputBuffer, 0); 227. resultObj = Tcl_NewStringObj(outputBuffer, (int)strlen(outputBuffer)); nsd/tclcrypto.c:230:5: Switch condition is true. Entering switch case 228. break; 229. 230. case RESULT_ENCODING_HEX: ^ 231. Ns_HexString(octects, outputBuffer, (int)octectLength, NS_FALSE); 232. resultObj = Tcl_NewStringObj(outputBuffer, (int)octectLength*2); nsd/tclcrypto.c:231:9: 229. 230. case RESULT_ENCODING_HEX: 231. Ns_HexString(octects, outputBuffer, (int)octectLength, NS_FALSE); ^ 232. resultObj = Tcl_NewStringObj(outputBuffer, (int)octectLength*2); 233. break; nsd/tclmisc.c:1385:1: start of procedure Ns_HexString() 1383. *---------------------------------------------------------------------- 1384. */ 1385. char * ^ 1386. Ns_HexString(const unsigned char *octets, char *outputBuffer, int size, bool isUpper) 1387. { nsd/tclmisc.c:1389:5: 1387. { 1388. int i; 1389. static const char hexCharsUpper[] = "0123456789ABCDEF"; ^ 1390. static const char hexCharsLower[] = "0123456789abcdef"; 1391. nsd/tclmisc.c:1390:5: 1388. int i; 1389. static const char hexCharsUpper[] = "0123456789ABCDEF"; 1390. static const char hexCharsLower[] = "0123456789abcdef"; ^ 1391. 1392. NS_NONNULL_ASSERT(octets != NULL); nsd/tclmisc.c:1392:5: 1390. static const char hexCharsLower[] = "0123456789abcdef"; 1391. 1392. NS_NONNULL_ASSERT(octets != NULL); ^ 1393. NS_NONNULL_ASSERT(outputBuffer != NULL); 1394. nsd/tclmisc.c:1393:5: 1391. 1392. NS_NONNULL_ASSERT(octets != NULL); 1393. NS_NONNULL_ASSERT(outputBuffer != NULL); ^ 1394. 1395. if (isUpper) { nsd/tclmisc.c:1395:9: Taking false branch 1393. NS_NONNULL_ASSERT(outputBuffer != NULL); 1394. 1395. if (isUpper) { ^ 1396. for (i = 0; i < size; ++i) { 1397. outputBuffer[i * 2] = hexCharsUpper[octets[i] >> 4]; nsd/tclmisc.c:1401:14: 1399. } 1400. } else { 1401. for (i = 0; i < size; ++i) { ^ 1402. outputBuffer[i * 2] = hexCharsLower[octets[i] >> 4]; 1403. outputBuffer[i * 2 + 1] = hexCharsLower[octets[i] & 0xFu]; nsd/tclmisc.c:1401:21: Loop condition is false. Leaving loop 1399. } 1400. } else { 1401. for (i = 0; i < size; ++i) { ^ 1402. outputBuffer[i * 2] = hexCharsLower[octets[i] >> 4]; 1403. outputBuffer[i * 2 + 1] = hexCharsLower[octets[i] & 0xFu]; nsd/tclmisc.c:1406:5: 1404. } 1405. } 1406. outputBuffer[size * 2] = '\0'; ^ 1407. 1408. return outputBuffer;