Skip to contentSkip to conversation

fix writing to unintended memory in pkt_generic_packet(); drivers/block/pktcdvd.c

PATCH In review Roel Kluin 2 participants 4 messages Nov 6, 2007 Block layer

lore
Share & tools
lore

Roel Kluin

author
#0 lore raw

PATCH 1/1 fix writing to unintended memory in pkt_generic_packet(); drivers/block/pktcdvd.c

CDROM_PACKET_SIZE is added as an offset to the pointer to unsigned char cmd[16]. The adjusted pointer is then used as a destination address in a call to memset(). However, when CDROM_PACKET_SIZE is added to the pointer, it is automatically scaled by the size of cmd, which is 16. This results in the call to memset() writing to unintended memory.

---

drivers/block/pktcdvd.c +1 -1
index a8130a4..548efcf 100644
@@ -767,7 +767,7 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *
 	rq->cmd_len = COMMAND_SIZE(cgc->cmd[0]);
 	memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
 	if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
-		memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
+		memset((char *)rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
 
 	rq->timeout = 60*HZ;
 	rq->cmd_type = REQ_TYPE_BLOCK_PC;
#1 lore raw
Quoted 5 lines · Roel Kluin

CDROM_PACKET_SIZE is added as an offset to the pointer to unsigned char cmd[16]. The adjusted pointer is then used as a destination address in a call to memset(). However, when CDROM_PACKET_SIZE is added to the pointer, it is automatically scaled by the size of cmd, which is 16. This results in the call to memset() writing to unintended memory.

What are you talking about? rq->cmd is an array, not a pointer to array. When it occurs as an argument of +, it decays to pointer to array element. Please, learn C.

author
#2 lore raw
Quoted 9 lines · Al Viro
Quoted 5 lines · Roel Kluin

CDROM_PACKET_SIZE is added as an offset to the pointer to unsigned char cmd[16]. The adjusted pointer is then used as a destination address in a call to memset(). However, when CDROM_PACKET_SIZE is added to the pointer, it is automatically scaled by the size of cmd, which is 16. This results in the call to memset() writing to unintended memory.

What are you talking about? rq->cmd is an array, not a pointer to array. When it occurs as an argument of +, it decays to pointer to array element.

Ok, I misunderstood, but please...

Quoted 1 line

Please, learn C.

That's not a nice thing to say.

#3 lore raw
Quoted 8 lines · Roel Kluin
Quoted 7 lines · Al Viro
Quoted 5 lines · Roel Kluin

CDROM_PACKET_SIZE is added as an offset to the pointer to unsigned char cmd[16]. The adjusted pointer is then used as a destination address in a call to memset(). However, when CDROM_PACKET_SIZE is added to the pointer, it is automatically scaled by the size of cmd, which is 16. This results in the call to memset() writing to unintended memory.

Quoted 8 lines
Quoted 2 lines

What are you talking about? rq->cmd is an array, not a pointer to array. When it occurs as an argument of +, it decays to pointer to array element.

Ok, I misunderstood, but please...

Quoted 1 line

Please, learn C.

That's not a nice thing to say.

Excuse me, but if you want to write in C, you will have to learn the language. Really. Including the relationship between pointers and arrays. No way around it, it's really basic stuff. Whether it's a nice thing to say or not, it is true and I do not know more polite way to phrase that.