diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index 2b8b610fe4e62c93e51290d0951aad7650a22fea..e70fba817e0c0e2f0c412b6e19b4ceb11278e606 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -1922,23 +1922,28 @@ int smb_putmsghdr(smb_t* smb, smbmsg_t* msg) return(SMB_ERR_HDR_LEN); } if(smb_hdrblocks(hdrlen) > smb_hdrblocks(msg->hdr.length)) { - off_t offset = msg->idx.offset; + smbmsg_t old_msg = *msg; int result = smb_new_msghdr(smb, msg, (smb->status.attr&SMB_HYPERALLOC) ? SMB_HYPERALLOC : SMB_SELFPACK, FALSE); if(result != SMB_SUCCESS) return result; - if(fseeko(smb->shd_fp, offset, SEEK_SET) != 0) { + if(fseeko(smb->shd_fp, old_msg.idx.offset, SEEK_SET) != 0) { safe_snprintf(smb->last_error,sizeof(smb->last_error) ,"%s %d '%s' seeking to %u in header file (to delete)", __FUNCTION__ ,get_errno(),STRERROR(get_errno()), (uint)msg->idx.offset); return(SMB_ERR_SEEK); } - msg->hdr.attr |= MSG_DELETE; - if(fwrite(&msg->hdr, sizeof(msg->hdr), 1, smb->shd_fp) != 1) { + old_msg.hdr.attr |= MSG_DELETE; + if(fwrite(&old_msg.hdr, sizeof(old_msg.hdr), 1, smb->shd_fp) != 1) { safe_snprintf(smb->last_error,sizeof(smb->last_error) ,"%s writing fixed portion of header record (to delete)", __FUNCTION__); return(SMB_ERR_WRITE); } - return smb_freemsghdr(smb, msg->idx.offset-smb->status.header_offset, msg->hdr.length); + if((smb->status.attr&SMB_HYPERALLOC) == 0 && (result = smb_open_ha(smb)) != SMB_SUCCESS) + return result; + result = smb_freemsghdr(smb, old_msg.idx.offset - smb->status.header_offset, old_msg.hdr.length); + if((smb->status.attr&SMB_HYPERALLOC) == 0) + smb_close_ha(smb); + return result; } msg->hdr.length=(uint16_t)hdrlen; /* store the actual header length */ /**********************************/