irda: irttp: allow zero byte packets

Sending zero byte packets is not neccessarily an error (AF_INET accepts it,
too), so just apply a shortcut. This was discovered because of a non-working
software with WINE. See

http://bugs.winehq.org/show_bug.cgi?id=19397#c86
http://thread.gmane.org/gmane.linux.irda.general/1643

for very detailed debugging information and a testcase. Kudos to Wolfgang for
those!

Reported-by: Wolfgang Schwotzer <wolfgang.schwotzer@gmx.net>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by: Mike Evans <mike.evans@cardolan.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Wolfram Sang and committed by
David S. Miller
4c62ab9c 3b42a96d

+19 -6
+19 -6
net/irda/irttp.c
··· 550 */ 551 int irttp_udata_request(struct tsap_cb *self, struct sk_buff *skb) 552 { 553 IRDA_ASSERT(self != NULL, return -1;); 554 IRDA_ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;); 555 IRDA_ASSERT(skb != NULL, return -1;); 556 557 IRDA_DEBUG(4, "%s()\n", __func__); 558 559 /* Check that nothing bad happens */ 560 - if ((skb->len == 0) || (!self->connected)) { 561 - IRDA_DEBUG(1, "%s(), No data, or not connected\n", 562 - __func__); 563 goto err; 564 } 565 ··· 583 584 err: 585 dev_kfree_skb(skb); 586 - return -1; 587 } 588 EXPORT_SYMBOL(irttp_udata_request); 589 ··· 606 IRDA_DEBUG(2, "%s() : queue len = %d\n", __func__, 607 skb_queue_len(&self->tx_queue)); 608 609 /* Check that nothing bad happens */ 610 - if ((skb->len == 0) || (!self->connected)) { 611 - IRDA_WARNING("%s: No data, or not connected\n", __func__); 612 ret = -ENOTCONN; 613 goto err; 614 }
··· 550 */ 551 int irttp_udata_request(struct tsap_cb *self, struct sk_buff *skb) 552 { 553 + int ret = -1; 554 + 555 IRDA_ASSERT(self != NULL, return -1;); 556 IRDA_ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;); 557 IRDA_ASSERT(skb != NULL, return -1;); 558 559 IRDA_DEBUG(4, "%s()\n", __func__); 560 561 + /* Take shortcut on zero byte packets */ 562 + if (skb->len == 0) { 563 + ret = 0; 564 + goto err; 565 + } 566 + 567 /* Check that nothing bad happens */ 568 + if (!self->connected) { 569 + IRDA_DEBUG(1, "%s(), Not connected\n", __func__); 570 goto err; 571 } 572 ··· 576 577 err: 578 dev_kfree_skb(skb); 579 + return ret; 580 } 581 EXPORT_SYMBOL(irttp_udata_request); 582 ··· 599 IRDA_DEBUG(2, "%s() : queue len = %d\n", __func__, 600 skb_queue_len(&self->tx_queue)); 601 602 + /* Take shortcut on zero byte packets */ 603 + if (skb->len == 0) { 604 + ret = 0; 605 + goto err; 606 + } 607 + 608 /* Check that nothing bad happens */ 609 + if (!self->connected) { 610 + IRDA_WARNING("%s: Not connected\n", __func__); 611 ret = -ENOTCONN; 612 goto err; 613 }