16진수 값을 넣고 싶은데요...
아래의 소스에서 (리눅스 커널에 있는 소스입니
다./usr/src/linux/net/ipv4/arp.c 파일의 일부입니다.)
******************로 체크된 memcopy의 src_hw 부분을 제가 원하는 값으
로 강제로 집어 넣고 싶은데요.
그래서.._-------------------------------이렇게 한 부분을 제가 넣었습
니다.
결국 제가 하고 싶은 것은 unsigned char br_hwaddr에 16진수로 FF(0xFF)
인 unsigned char를 넣고 싶은 것입니다. 그것도 6개를 쫙 붙여서...
(찍어보니까..y 자 위에 점 두개 찍혀있는 그런 문자던데....)
그런데...이 부분을..즉..제가 수정한 부분만을 따로 띄어내서 컴파일 하
면..정상적으로 동작합니다.
그러나 이렇게 수정하고..커널 컴파일을 하면..커널 패닉이 나고..에러들
이 쫙 뜨면서..아무것도 안 먹습니다...
한..2틀동안 이것 저것 해보면서..커널 컴파일만..40번을 넘게 햇습니다.
도와주세요..어디가 문제인지..ㅜ.ㅜ
void arp_send(int type, int ptype, u32 dest_ip,
struct net_device *dev, u32 src_ip,
unsigned char *dest_hw, unsigned char *src_hw,
unsigned char *target_hw)
{
struct sk_buff *skb;
struct arphdr *arp;
unsigned char *arp_ptr;
------------------------------------------------------
제가 새로 넣은 부분입니다.
unsigned char buffer[6];
unsigned char *br_hwaddr;
unsigned char *br_hwaddr_temp;
*br_hwaddr_temp = (unsigned char)255;
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
br_hwaddr = buffer;
여기까지..추가.
------------------------------------------------------------
/*
* No arp on this interface.
*/
if (dev->flags&IFF_NOARP)
return;
/*
* Allocate a buffer
*/
skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4)
+ dev->hard_header_len + 15,
GFP_ATOMIC);
if (skb == NULL)
return;
skb_reserve(skb, (dev->hard_header_len+15)&~15);
skb->nh.raw = skb->data;
arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr)
+ 2*(dev->addr_len+4));
skb->dev = dev;
skb->protocol = __constant_htons (ETH_P_ARP);
if (src_hw == NULL)
src_hw = dev->dev_addr;
if (dest_hw == NULL)
dest_hw = dev->broadcast;
/*
* Fill the device header for the ARP frame
*/
if (dev->hard_header &&
dev->hard_header(skb,dev,ptype,dest_hw,src_hw,skb-
>len) < 0)
goto out;
/*
* Fill out the arp protocol part.
*
* The arp hardware type should match the device type,
except for FDDI,
* which (according to RFC 1390) should always equal 1
(Ethernet).
*/
/*
* Exceptions everywhere. AX.25 uses the AX.25 PID
value not the
* DIX code for the protocol. Make these device
structure fields.
*/
switch (dev->type) {
default
arp->ar_hrd = htons(dev->type);
arp->ar_pro = __constant_htons(ETH_P_IP);
break;
#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
case ARPHRD_AX25
arp->ar_hrd = __constant_htons(ARPHRD_AX25);
arp->ar_pro = __constant_htons(AX25_P_IP);
break;
#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
case ARPHRD_NETROM
arp->ar_hrd = __constant_htons(ARPHRD_NETROM);
arp->ar_pro = __constant_htons(AX25_P_IP);
break;
#endif
#endif
#ifdef CONFIG_FDDI
case ARPHRD_FDDI
arp->ar_hrd = __constant_htons(ARPHRD_ETHER);
arp->ar_pro = __constant_htons(ETH_P_IP);
break;
#endif
#ifdef CONFIG_TR
case ARPHRD_IEEE802_TR
arp->ar_hrd = __constant_htons(ARPHRD_IEEE802);
arp->ar_pro = __constant_htons(ETH_P_IP);
break;
#endif
}
arp->ar_hln = dev->addr_len;
arp->ar_pln = 4;
arp->ar_op = htons(type);
arp_ptr=(unsigned char *)(arp+1);
******************************************************
/* memcpy(arp_ptr, src_hw, dev->addr_len); <---이 부분아래와
같이 수정하고 주석으로 막아놨습니다.?
memcpy(arp_ptr, br_hwaddr, dev->addr_len); <-이렇게 바꿨습니
다.
********************************************************
arp_ptr+=dev->addr_len;
memcpy(arp_ptr, &src_ip,4);
arp_ptr+=4;
if (target_hw != NULL)
memcpy(arp_ptr, target_hw, dev->addr_len);
else
memset(arp_ptr, 0, dev->addr_len);
arp_ptr+=dev->addr_len;
memcpy(arp_ptr, &dest_ip, 4);
dev_queue_xmit(skb);
return;
out
kfree_skb(skb);
}
Re: 16진수 값을 넣고 싶은데요...
제가 새로 넣은 부분입니다.
unsigned char buffer[6];
unsigned char *br_hwaddr;
unsigned char *br_hwaddr_temp;
*br_hwaddr_temp = (unsigned char)255;
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
br_hwaddr = buffer;
여기까지..추가.
------------------------------------------------------------
br_hwaddr 를 다른 용도로 쓰시지 않는다면
unsigned char br_hwaddr[6] = {255, 255, 255, 255, 255, 255};
정도로 하시거나, 또는 변경되지 않는다면 static 을 붙여주시는것도
괜찮을 듯 싶습니다.
strcat() 은 source문자열 뒤에 dest문자열을 복사하는 것이기 때문에
잘못된 결과가 나옵니다.
*br_hwaddr_temp = (unsigned char)255; br_hwaddr_temp가 초기화되어 있지 않기 때문에 임의의 곳을 가리킬 수
있고, 위의 할당문에 의해 메모리상의 어디엔가의 값이 255로 바뀌었습니
다. 잘못된 코드이고요.
strcat(buffer, br_hwaddr_temp); br_hdaddr_temp 가 가리키는 맨 첫 바이트는 255를 가지고 있지만 그 후
에 어떤 값이 있을지 모릅니다. 따라서 위 문장은 255를 buffer에 복사하
는 것이 아니라 br_hwaddr_temp 가 가리키고 있는 곳에서 NULL (0) 이 나
올때까지 있는 문자열을 buffer에 복사합니다. 몇 바이트가 복사될지는
알 수 없습니다.
strcat()을 6번 호출했는데, br_hwaddr_temp가 가리키는 곳의 다음 바이
트에 바로 0이 온다고 하더라도 NULL까지 복사되기 때문에 buffer에는
255 여섯개와 끝에 NULL 을 포함해서 7바이트의 문자가 필요하게 됩니
다. 따라서 메모리를 깨 먹겠죠.
지금의 경우는 아마 br_hdaddr 을 깨 먹을 것 같은데 곧바로 br_hwaddr
이 buffer를 가리키도록 할당되기 때문에 영향은 없겠지만 위험한 코드입
니다.
정말 감사합니다.
지금 말씀하신대로 해보고
다시 커널 컴파일 하고 있습니다.
결과는 아직 안나왔지만..대충 어디가 문제인지..
많은 도움이 되었습니다.
그럼..
좋은 하루되세요.
댓글 달기