~ubuntu-branches/ubuntu/hardy/gnupg2/hardy

« back to all changes in this revision

Viewing changes to scd/command.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Bienia, Michael Bienia, Kees Cook
  • Date: 2006-12-07 00:28:23 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20061207002823-0i7ittrpmsm1nv0i
Tags: 2.0.1-0ubuntu1
[ Michael Bienia ]
* New upstream version.
* Remaining changes:
  - Remove libpcsclite-dev, libopensc2-dev build dependencies (they are in
    universe).
* g10/encr-data.c: remotely controllable function pointer (CVE-2006-6235)
* debian/control: add libcurl3-gnutls-dev to build-depends 
  (Closes Ubuntu: #62864)

[ Kees Cook ]
* debian/rules: include doc/ files as done with gnupg

Show diffs side-by-side

added added

removed removed

Lines of Context:
721
721
  unsigned char *value;
722
722
  size_t valuelen;
723
723
 
 
724
  if (!retstr)
 
725
    {
 
726
      /* We prompt for keypad entry.  To make sure that the popup has
 
727
         been show we use an inquire and not just a status message.
 
728
         We ignore any value returned.  */
 
729
      if (info)
 
730
        {
 
731
          log_debug ("prompting for keypad entry '%s'\n", info);
 
732
          rc = asprintf (&command, "POPUPKEYPADPROMPT %s", info);
 
733
          if (rc < 0)
 
734
            return gpg_error (gpg_err_code_from_errno (errno));
 
735
          rc = assuan_inquire (ctx, command, &value, &valuelen, MAXLEN_PIN); 
 
736
          free (command);  
 
737
        }
 
738
      else
 
739
        {
 
740
          log_debug ("dismiss keypad entry prompt\n");
 
741
          rc = assuan_inquire (ctx, "DISMISSKEYPADPROMPT",
 
742
                               &value, &valuelen, MAXLEN_PIN); 
 
743
        }
 
744
      if (!rc)
 
745
        xfree (value);
 
746
      return rc;
 
747
    }
 
748
 
724
749
  *retstr = NULL;
725
750
  log_debug ("asking for PIN '%s'\n", info);
726
751
 
1584
1609
/* Startup the server.  If FD is given as -1 this is simple pipe
1585
1610
   server, otherwise it is a regular server. */
1586
1611
void
1587
 
scd_command_handler (int fd)
 
1612
scd_command_handler (ctrl_t ctrl, int fd)
1588
1613
{
1589
1614
  int rc;
1590
1615
  assuan_context_t ctx;
1591
 
  struct server_control_s ctrl;
1592
 
 
1593
 
  memset (&ctrl, 0, sizeof ctrl);
1594
 
  scd_init_default_ctrl (&ctrl);
1595
1616
  
1596
1617
  if (fd == -1)
1597
1618
    {
1618
1639
                 gpg_strerror(rc));
1619
1640
      scd_exit (2);
1620
1641
    }
1621
 
  assuan_set_pointer (ctx, &ctrl);
 
1642
  assuan_set_pointer (ctx, ctrl);
1622
1643
 
1623
1644
  /* Allocate and initialize the server object.  Put it into the list
1624
1645
     of active sessions. */
1625
 
  ctrl.server_local = xcalloc (1, sizeof *ctrl.server_local);
1626
 
  ctrl.server_local->next_session = session_list;
1627
 
  session_list = ctrl.server_local;
1628
 
  ctrl.server_local->ctrl_backlink = &ctrl;
1629
 
  ctrl.server_local->assuan_ctx = ctx;
 
1646
  ctrl->server_local = xcalloc (1, sizeof *ctrl->server_local);
 
1647
  ctrl->server_local->next_session = session_list;
 
1648
  session_list = ctrl->server_local;
 
1649
  ctrl->server_local->ctrl_backlink = ctrl;
 
1650
  ctrl->server_local->assuan_ctx = ctx;
1630
1651
 
1631
1652
  if (DBG_ASSUAN)
1632
1653
    assuan_set_log_stream (ctx, log_get_stream ());
1633
1654
 
1634
1655
  /* We open the reader right at startup so that the ticker is able to
1635
1656
     update the status file. */
1636
 
  if (ctrl.reader_slot == -1)
 
1657
  if (ctrl->reader_slot == -1)
1637
1658
    {
1638
 
      ctrl.reader_slot = get_reader_slot ();
 
1659
      ctrl->reader_slot = get_reader_slot ();
1639
1660
    }
1640
1661
 
1641
1662
  /* Command processing loop. */
1661
1682
    }
1662
1683
 
1663
1684
  /* Cleanup.  */
1664
 
  do_reset (&ctrl, 0); 
 
1685
  do_reset (ctrl, 0); 
1665
1686
 
1666
1687
  /* Release the server object.  */
1667
 
  if (session_list == ctrl.server_local)
1668
 
    session_list = ctrl.server_local->next_session;
 
1688
  if (session_list == ctrl->server_local)
 
1689
    session_list = ctrl->server_local->next_session;
1669
1690
  else
1670
1691
    {
1671
1692
      struct server_local_s *sl;
1672
1693
      
1673
1694
      for (sl=session_list; sl->next_session; sl = sl->next_session)
1674
 
        if (sl->next_session == ctrl.server_local)
 
1695
        if (sl->next_session == ctrl->server_local)
1675
1696
          break;
1676
1697
      if (!sl->next_session)
1677
1698
          BUG ();
1678
 
      sl->next_session = ctrl.server_local->next_session;
 
1699
      sl->next_session = ctrl->server_local->next_session;
1679
1700
    }
1680
 
  xfree (ctrl.server_local);
 
1701
  xfree (ctrl->server_local);
 
1702
  ctrl->server_local = NULL;
1681
1703
 
1682
1704
  /* Release the Assuan context.  */
1683
1705
  assuan_deinit_server (ctx);