summaryrefslogtreecommitdiff
path: root/qa/src/crashpmcd.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/crashpmcd.c')
-rw-r--r--qa/src/crashpmcd.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/qa/src/crashpmcd.c b/qa/src/crashpmcd.c
new file mode 100644
index 0000000..9f9e944
--- /dev/null
+++ b/qa/src/crashpmcd.c
@@ -0,0 +1,85 @@
+/*
+ * Crashes pmcd on IRIX. Linux seems to be OK. PV 935490.
+ */
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+static __pmPDUHdr hdr;
+static char *target;
+
+void
+try(int len)
+{
+ int fd;
+ int sts;
+ static int first = 1;
+ static struct sockaddr_in myAddr;
+ static struct hostent* servInfo;
+ char buf[256];
+
+ if (first) {
+ first = 0;
+ if ((servInfo = gethostbyname(target)) == NULL) {
+ fprintf(stderr, "host \"%s\" unknown\n", target);
+ exit(1);
+ }
+ memset(&myAddr, 0, sizeof(myAddr));
+ myAddr.sin_family = AF_INET;
+ memcpy(&myAddr.sin_addr, servInfo->h_addr, servInfo->h_length);
+ myAddr.sin_port = htons(SERVER_PORT);
+ }
+
+ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+ fprintf(stderr, "socket failed: %s\n", pmErrStr(errno));
+ return;
+ }
+
+ if ((sts = connect(fd, (struct sockaddr*) &myAddr, sizeof(myAddr))) < 0) {
+ fprintf(stderr, "connect failed: %s\n", pmErrStr(sts));
+ close(fd);
+ return;
+ }
+
+ if ((sts = write(fd, &hdr, len)) != len) {
+ fprintf(stderr, "write failed: %s\n", pmErrStr(sts));
+ close(fd);
+ return;
+ }
+ sts = read(fd, buf, sizeof(buf));
+ if (sts < 0) {
+ /* in this case don't really care about the return code from read() */
+ ;
+ }
+ close(fd);
+}
+
+int
+main(int argc, char *argv[])
+{
+ int j;
+ int k;
+
+ __pmSetProgname(argv[0]);
+
+ target = argc == 2 ? argv[1] : "localhost";
+
+ hdr.from = htonl(12345);
+
+ for (k = -1; k <= 12; k++) {
+ hdr.len = htonl(k);
+ hdr.type = htonl(0x55aa0000);
+ for (j = 0; j <= 12; j++) {
+ try(j);
+ }
+ }
+
+ for (k = 0; k <= 12; k++) {
+ hdr.len = htonl(k<<24);
+ hdr.type = htonl(0x000055aa);
+ for (j = 0; j <= 12; j++) {
+ try(j);
+ }
+ }
+
+ return 0;
+}