История изменений
Исправление WeSTMan, (текущая версия) :
Чего то я не понимаю, в исходниках нашел хороший пример:
skb2 = skb_copy_expand(skb, EEM_HLEN, ETH_FCS_LEN + padlen, GFP_ATOMIC);
dev_kfree_skb_any(skb);
skb = skb2;
if (!skb) return skb;
Сделал по примеру:
struct sk_buff *skb_copy;
skb_copy = skb_copy_expand(skb, skb_headroom(skb), skb->tail+extra_data_len, GFP_ATOMIC);
if (!skb_copy) {
printk("Not skb_copy :(\n");
dev_kfree_skb(skb_copy);
return NF_DROP;
}
dev_kfree_skb(skb);
skb = skb_copy;
Получил ошибку:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000048
А так же работу трейса
[31266.194001] [] ip_output+0x5f/0xd0
[31266.194515] [] ? __ip_local_out+0x52/0xf0
[31266.195050] [] ? ip_fragment.constprop.53+0x80/0x80
[31266.195570] [] ip_local_out+0x3b/0x50
[31266.196091] [] ip_send_skb+0x19/0x40
[31266.196611] [] udp_send_skb+0x16d/0x290
[31266.197128] [] udp_sendmsg+0x533/0xb20
[31266.197649] [] ? ip_reply_glue_bits+0x60/0x60
[31266.198172] [] ? aa_sock_msg_perm+0x5d/0x140
[31266.198727] [] inet_sendmsg+0x6d/0xa0
[31266.199094] [] sock_sendmsg+0x3e/0x50
[31266.199446] [] SYSC_sendto+0x102/0x190
[31266.199794] [] ? dentry_free+0x4e/0x90
[31266.200148] [] ? __dentry_kill+0x157/0x1e0
[31266.200623] [] SyS_sendto+0xe/0x10
[31266.201147] [] compat_SyS_socketcall+0x272/0x4c0
[31266.201673] [] ? do_gettimeofday+0x1a/0x50
[31266.202198] [] do_fast_syscall_32+0xb2/0x150
[31266.202723] [] sysenter_flags_fixed+0x8/0x15
Как я понял - идет фрагментация? Или что-то с указателем :(
И почему то я получил неверные данные:
tail - 176 | end - 192
[31986.663522] skb copy success copied
[31986.664141] tail - 196 | end - 704
Тут видно, что не хватает 4 байт, но почему end = 704?
Исправление WeSTMan, :
Чего то я не понимаю, в исходниках нашел хороший пример:
skb2 = skb_copy_expand(skb, EEM_HLEN, ETH_FCS_LEN + padlen, GFP_ATOMIC);
dev_kfree_skb_any(skb);
skb = skb2;
if (!skb) return skb;
Сделал по примеру:
struct sk_buff *skb_copy;
skb_copy = skb_copy_expand(skb, skb_headroom(skb), skb->tail+extra_data_len, GFP_ATOMIC);
if (!skb_copy) {
printk("Not skb_copy :(\n");
dev_kfree_skb(skb_copy);
return NF_DROP;
}
dev_kfree_skb(skb);
skb = skb_copy;
Получил ошибку:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000048
А так же работу трейса
[31266.194001] [] ip_output+0x5f/0xd0
[31266.194515] [] ? __ip_local_out+0x52/0xf0
[31266.195050] [] ? ip_fragment.constprop.53+0x80/0x80
[31266.195570] [] ip_local_out+0x3b/0x50
[31266.196091] [] ip_send_skb+0x19/0x40
[31266.196611] [] udp_send_skb+0x16d/0x290
[31266.197128] [] udp_sendmsg+0x533/0xb20
[31266.197649] [] ? ip_reply_glue_bits+0x60/0x60
[31266.198172] [] ? aa_sock_msg_perm+0x5d/0x140
[31266.198727] [] inet_sendmsg+0x6d/0xa0
[31266.199094] [] sock_sendmsg+0x3e/0x50
[31266.199446] [] SYSC_sendto+0x102/0x190
[31266.199794] [] ? dentry_free+0x4e/0x90
[31266.200148] [] ? __dentry_kill+0x157/0x1e0
[31266.200623] [] SyS_sendto+0xe/0x10
[31266.201147] [] compat_SyS_socketcall+0x272/0x4c0
[31266.201673] [] ? do_gettimeofday+0x1a/0x50
[31266.202198] [] do_fast_syscall_32+0xb2/0x150
[31266.202723] [] sysenter_flags_fixed+0x8/0x15
Как я понял - идет фрагментация? Или что-то с указателем :(
И почему то я получил неверные данные tail - 176 | end - 192
[31986.663522] skb copy success copied
[31986.664141] tail - 196 | end - 704
Тут видно, что не хватает 4 байт, но почему end = 704?
Исправление WeSTMan, :
Чего то я не понимаю, в исходниках нашел хороший пример:
skb2 = skb_copy_expand(skb, EEM_HLEN, ETH_FCS_LEN + padlen, GFP_ATOMIC);
dev_kfree_skb_any(skb);
skb = skb2;
if (!skb) return skb;
Сделал по примеру:
struct sk_buff *skb_copy;
skb_copy = skb_copy_expand(skb, skb_headroom(skb), skb->tail+extra_data_len, GFP_ATOMIC);
if (!skb_copy) {
printk("Not skb_copy :(\n");
dev_kfree_skb(skb_copy);
return NF_DROP;
}
dev_kfree_skb(skb);
skb = skb_copy;
Получил ошибку:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000048
А так же работу трейса
[31266.194001] [] ip_output+0x5f/0xd0
[31266.194515] [] ? __ip_local_out+0x52/0xf0
[31266.195050] [] ? ip_fragment.constprop.53+0x80/0x80
[31266.195570] [] ip_local_out+0x3b/0x50
[31266.196091] [] ip_send_skb+0x19/0x40
[31266.196611] [] udp_send_skb+0x16d/0x290
[31266.197128] [] udp_sendmsg+0x533/0xb20
[31266.197649] [] ? ip_reply_glue_bits+0x60/0x60
[31266.198172] [] ? aa_sock_msg_perm+0x5d/0x140
[31266.198727] [] inet_sendmsg+0x6d/0xa0
[31266.199094] [] sock_sendmsg+0x3e/0x50
[31266.199446] [] SYSC_sendto+0x102/0x190
[31266.199794] [] ? dentry_free+0x4e/0x90
[31266.200148] [] ? __dentry_kill+0x157/0x1e0
[31266.200623] [] SyS_sendto+0xe/0x10
[31266.201147] [] compat_SyS_socketcall+0x272/0x4c0
[31266.201673] [] ? do_gettimeofday+0x1a/0x50
[31266.202198] [] do_fast_syscall_32+0xb2/0x150
[31266.202723] [] sysenter_flags_fixed+0x8/0x15
Как я понял - идет фрагментация? Или что-то с указателем :(
Исходная версия WeSTMan, :
Чего то я не понимаю, в исходниках нашел хороший пример:
skb2 = skb_copy_expand(skb, EEM_HLEN, ETH_FCS_LEN + padlen, GFP_ATOMIC);
dev_kfree_skb_any(skb);
skb = skb2;
if (!skb) return skb;
Сделал по примеру: struct sk_buff *skb_copy;
skb_copy = skb_copy_expand(skb, skb_headroom(skb), skb->tail+extra_data_len, GFP_ATOMIC);
if (!skb_copy) {
printk("Not skb_copy :(\n");
dev_kfree_skb(skb_copy);
return NF_DROP;
}
dev_kfree_skb(skb);
skb = skb_copy;
Получил ошибку:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000048
А так же работу трейса
[31266.194001] [] ip_output+0x5f/0xd0
[31266.194515] [] ? __ip_local_out+0x52/0xf0
[31266.195050] [] ? ip_fragment.constprop.53+0x80/0x80
[31266.195570] [] ip_local_out+0x3b/0x50
[31266.196091] [] ip_send_skb+0x19/0x40
[31266.196611] [] udp_send_skb+0x16d/0x290
[31266.197128] [] udp_sendmsg+0x533/0xb20
[31266.197649] [] ? ip_reply_glue_bits+0x60/0x60
[31266.198172] [] ? aa_sock_msg_perm+0x5d/0x140
[31266.198727] [] inet_sendmsg+0x6d/0xa0
[31266.199094] [] sock_sendmsg+0x3e/0x50
[31266.199446] [] SYSC_sendto+0x102/0x190
[31266.199794] [] ? dentry_free+0x4e/0x90
[31266.200148] [] ? __dentry_kill+0x157/0x1e0
[31266.200623] [] SyS_sendto+0xe/0x10
[31266.201147] [] compat_SyS_socketcall+0x272/0x4c0
[31266.201673] [] ? do_gettimeofday+0x1a/0x50
[31266.202198] [] do_fast_syscall_32+0xb2/0x150
[31266.202723] [] sysenter_flags_fixed+0x8/0x15
Как я понял - идет фрагментация? Или что-то с указателем :(