@@ -501,11 +501,11 @@ if (toWrite <= 0 || statePtr->self == (Tcl_Channel) NULL) { return 0; } /* Update hash function */ - if (toWrite > 0 && DigestUpdate(statePtr, buf, (size_t) toWrite, 0) != TCL_OK) { + if (DigestUpdate(statePtr, buf, (size_t) toWrite, 0) != TCL_OK) { Tcl_SetChannelError(statePtr->self, Tcl_ObjPrintf("Update failed: %s", REASON())); *errorCodePtr = EINVAL; return 0; } return toWrite; @@ -783,10 +783,16 @@ return TCL_ERROR; } /* Make sure to operate on the topmost channel */ chan = Tcl_GetTopChannel(chan); + + /* Configure channel */ + Tcl_SetChannelOption(interp, chan, "-translation", "binary"); + if (Tcl_GetChannelBufferSize(chan) < EVP_MAX_MD_SIZE * 2) { + Tcl_SetChannelBufferSize(chan, EVP_MAX_MD_SIZE * 2); + } /* Create state data structure */ if ((statePtr = DigestStateNew(interp, format)) == NULL) { Tcl_AppendResult(interp, "Memory allocation error", (char *) NULL); return TCL_ERROR; @@ -797,17 +803,11 @@ /* Initialize hash function */ if (DigestInitialize(interp, statePtr, md, cipher, keyObj, mac) != TCL_OK) { return TCL_ERROR; } - /* Configure channel */ - Tcl_SetChannelOption(interp, chan, "-translation", "binary"); - if (Tcl_GetChannelBufferSize(chan) < EVP_MAX_MD_SIZE * 2) { - Tcl_SetChannelBufferSize(chan, EVP_MAX_MD_SIZE * 2); - } - - /* Stack channel, abort for error */ + /* Stack channel */ statePtr->self = Tcl_StackChannel(interp, &digestChannelType, (ClientData) statePtr, mode, chan); if (statePtr->self == (Tcl_Channel) NULL) { DigestStateFree(statePtr); return TCL_ERROR; } @@ -1031,11 +1031,11 @@ if ((statePtr = DigestStateNew(interp, format)) == NULL) { Tcl_AppendResult(interp, "Memory allocation error", (char *) NULL); return TCL_ERROR; } - /* Calc Digest, abort for error */ + /* Calc Digest */ if (DigestInitialize(interp, statePtr, md, cipher, keyObj, mac) != TCL_OK || DigestUpdate(statePtr, data, (size_t) data_len, 1) != TCL_OK || DigestFinalize(interp, statePtr, NULL) != TCL_OK) { DigestStateFree(statePtr); return TCL_ERROR; @@ -1076,11 +1076,11 @@ if ((statePtr = DigestStateNew(interp, format)) == NULL) { Tcl_AppendResult(interp, "Memory allocation error", (char *) NULL); return TCL_ERROR; } - /* Open file channel, abort for error */ + /* Open file channel */ chan = Tcl_FSOpenFileChannel(interp, inFileObj, "rb", 0444); if (chan == (Tcl_Channel) NULL) { DigestStateFree(statePtr); return TCL_ERROR; }