https://bugs.kde.org/show_bug.cgi?id=441936

            Bug ID: 441936
           Summary: Valgrind crashes with "Assertion 'iFuncWrapper'
                    failed."
           Product: valgrind
           Version: unspecified
          Platform: Other
                OS: Linux
            Status: REPORTED
          Severity: crash
          Priority: NOR
         Component: memcheck
          Assignee: jsew...@acm.org
          Reporter: wissen.komp...@gmail.com
  Target Milestone: ---

SUMMARY

I'm using valgrind 3.17.0. I compiled and ran successfully the following
program called "recording.c":

#include <alsa/asoundlib.h>
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

struct WaveHeader {
  char RIFF_marker[4];
  uint32_t file_size;
  char filetype_header[4];
  char format_marker[4];
  uint32_t data_header_length;
  uint16_t format_type;
  uint16_t number_of_channels;
  uint32_t sample_rate;
  uint32_t bytes_per_second;
  uint16_t bytes_per_frame;
  uint16_t bits_per_sample;
};

struct WaveHeader *genericWAVHeader(uint32_t sample_rate, uint16_t bit_depth,
                                    uint16_t channels) {
  struct WaveHeader *hdr;
  hdr = malloc(sizeof(*hdr));
  if (!hdr) return NULL;

  memcpy(&hdr->RIFF_marker, "RIFF", 4);
  memcpy(&hdr->filetype_header, "WAVE", 4);
  memcpy(&hdr->format_marker, "fmt ", 4);
  hdr->data_header_length = 16;
  hdr->format_type = 1;
  hdr->number_of_channels = channels;
  hdr->sample_rate = sample_rate;
  hdr->bytes_per_second = sample_rate * channels * bit_depth / 8;
  hdr->bytes_per_frame = channels * bit_depth / 8;
  hdr->bits_per_sample = bit_depth;

  return hdr;
}

int writeWAVHeader(FILE *out, struct WaveHeader *hdr) {
  if (!hdr) return -1;

  fwrite(&hdr->RIFF_marker, 1, 4, out);
  fwrite(&hdr->file_size, 1, 4, out);
  fwrite(&hdr->filetype_header, 1, 4, out);
  fwrite(&hdr->format_marker, 1, 4, out);
  fwrite(&hdr->data_header_length, 1, 4, out);
  fwrite(&hdr->format_type, 1, 2, out);
  fwrite(&hdr->number_of_channels, 1, 2, out);
  fwrite(&hdr->sample_rate, 1, 4, out);
  fwrite(&hdr->bytes_per_second, 1, 4, out);
  fwrite(&hdr->bytes_per_frame, 1, 2, out);
  fwrite(&hdr->bits_per_sample, 1, 2, out);
  fwrite("data", 1, 4, out);

  // write(fd, &hdr->RIFF_marker, 4);
  // write(fd, &hdr->file_size, 4);
  // write(fd, &hdr->filetype_header, 4);
  // write(fd, &hdr->format_marker, 4);
  // write(fd, &hdr->data_header_length, 4);
  // write(fd, &hdr->format_type, 2);
  // write(fd, &hdr->number_of_channels, 2);
  // write(fd, &hdr->sample_rate, 4);
  // write(fd, &hdr->bytes_per_second, 4);
  // write(fd, &hdr->bytes_per_frame, 2);
  // write(fd, &hdr->bits_per_sample, 2);
  // write(fd, "data", 4);

  uint32_t data_size = hdr->file_size + 8 - 44;
  fwrite(&data_size, 1, 4, out);
  // write(fd, &data_size, 4);

  return 0;
}

int main() {
  int i;
  int err;
  char *buffer;
  int buffer_frames = 160;
  unsigned int rate = 16000;
  unsigned int channels = 5;
  uint32_t duration = 5000;
  char hardware[] = "hw:2,0";
  snd_pcm_uframes_t frames = 32;
  snd_pcm_t *capture_handle;
  snd_pcm_hw_params_t *hw_params;
  snd_pcm_format_t format = SND_PCM_FORMAT_S32_LE;

  if ((err = snd_pcm_open(&capture_handle, hardware, SND_PCM_STREAM_CAPTURE,
                          0)) < 0) {
    fprintf(stderr, "cannot open audio device %s (%s)\n", hardware,
            snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "audio interface opened\n");

  if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {
    fprintf(stderr, "cannot allocate hardware parameter structure (%s)\n",
            snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params allocated\n");

  if ((err = snd_pcm_hw_params_any(capture_handle, hw_params)) < 0) {
    fprintf(stderr, "cannot initialize hardware parameter structure (%s)\n",
            snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params initialized\n");

  if ((err = snd_pcm_hw_params_set_access(capture_handle, hw_params,
                                          SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
{
    fprintf(stderr, "cannot set access type (%s)\n", snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params access setted\n");

  if ((err = snd_pcm_hw_params_set_format(capture_handle, hw_params, format)) <
      0) {
    fprintf(stderr, "cannot set sample format (%s)\n", snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params format setted\n");

  if ((err = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &rate,
                                             0)) < 0) {
    fprintf(stderr, "cannot set sample rate (%s)\n", snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params rate setted\n");

  if ((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params,
channels)) <
      0) {
    fprintf(stderr, "cannot set channel count (%s)\n", snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params channels setted\n");

  if ((err = snd_pcm_hw_params(capture_handle, hw_params)) < 0) {
    fprintf(stderr, "cannot set parameters (%s)\n", snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "hw_params setted\n");

  snd_pcm_hw_params_free(hw_params);

  fprintf(stdout, "hw_params freed\n");

  if ((err = snd_pcm_prepare(capture_handle)) < 0) {
    fprintf(stderr, "cannot prepare audio interface for use (%s)\n",
            snd_strerror(err));
    exit(1);
  }

  fprintf(stdout, "audio interface prepared\n");

  buffer = (char *)malloc(160 * snd_pcm_format_width(format) / 8 * 5);

  fprintf(stdout, "buffer allocated\n");

  struct WaveHeader *hdr;
  int size = frames * hdr->bits_per_sample / 8 * hdr->number_of_channels;

  FILE *out;
  out = fopen("zwave.wav", "wb");

  // write empty header
  for (int i = 0; i < 44; i++) {
    fputc(0x00, out);
  }

  fprintf(stdout, "Recording...\n");
  for (int i = duration * 1000 / rate; i > 0; i--) {
    if ((err = snd_pcm_readi(capture_handle, buffer, buffer_frames)) !=
        buffer_frames) {
      fprintf(stderr, "read from audio interface failed (%s)\n", err,
              snd_strerror(err));
      exit(1);
    }

    fwrite(buffer, 1, 160 * snd_pcm_format_width(format) / 8 * 5, out);
    // write(filedesc, buffer, size);
  }

  // Write real header to file
  rewind(out);
  hdr = genericWAVHeader(rate, 32, channels);
  uint32_t pcm_data_size =
      hdr->sample_rate * hdr->bytes_per_frame * duration / 1000;
  hdr->file_size = pcm_data_size + 44 - 8;
  err = writeWAVHeader(out, hdr);
  fclose(out);

  free(buffer);

  fprintf(stdout, "buffer freed\n");

  snd_pcm_close(capture_handle);
  fprintf(stdout, "audio interface closed\n");

  return 0;
}


I compiled it with "gcc -g recording.c -o recording -lasound -lpthread"

OBSERVED RESULT
# valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes
--verbose ./recording
==3530== Memcheck, a memory error detector
==3530== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3530== Using Valgrind-3.17.0-07f0cdcbb4-20210319X and LibVEX; rerun with -h
for copyright info
==3530== Command: ./recording
==3530==
--3530-- Valgrind options:
--3530--    --leak-check=full
--3530--    --show-leak-kinds=all
--3530--    --track-origins=yes
--3530--    --verbose
--3530-- Contents of /proc/version:
--3530--   Linux version 5.4.3-23.cm1 (root@mariner) (gcc version 9.1.0 (GCC))
#1-mariner SMP PREEMPT Tue May 11 22:19:15 UTC 2021
--3530--
--3530-- Arch and hwcaps: ARM64, LittleEndian, v8
--3530-- Page sizes: currently 4096, max supported 65536
--3530-- Valgrind library directory: /home/admin/valgrind-3.17.0/memcheck
--3530-- Reading syms from /var/custom-configs/home/admin/recording
--3530-- Reading syms from /usr/lib/ld-2.28.so
--3530-- Reading syms from
/var/custom-configs/home/admin/valgrind-3.17.0/memcheck/memcheck-arm64-linux
--3530--    object doesn't have a dynamic symbol table
--3530-- Scheduler: using generic scheduler lock implementation.
--3530-- Reading suppressions file:
/home/admin/valgrind-3.17.0/memcheck/default.supp
==3530== embedded gdbserver: reading from
/tmp/vgdb-pipe-from-vgdb-to-3530-by-root-on-???
==3530== embedded gdbserver: writing to  
/tmp/vgdb-pipe-to-vgdb-from-3530-by-root-on-???
==3530== embedded gdbserver: shared mem  
/tmp/vgdb-pipe-shared-mem-vgdb-3530-by-root-on-???
==3530==
==3530== TO CONTROL THIS PROCESS USING vgdb (which you probably
==3530== don't want to do, unless you know exactly what you're doing,
==3530== or are doing some strange experiment):
==3530==   /home/admin/valgrind-3.17.0/memcheck/../../bin/vgdb --pid=3530
...command...
==3530==
==3530== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==3530==   /path/to/gdb ./recording
==3530== and then give GDB the following command
==3530==   target remote | /home/admin/valgrind-3.17.0/memcheck/../../bin/vgdb
--pid=3530
==3530== --pid is optional if only one valgrind process is running
==3530==
--3530-- REDIR: 0x4017340 (ld-linux-aarch64.so.1:strlen) redirected to
0x580c8798 (vgPlain_arm64_linux_REDIR_FOR_strlen)
--3530-- REDIR: 0x40170c0 (ld-linux-aarch64.so.1:strcmp) redirected to
0x580c87ec (vgPlain_arm64_linux_REDIR_FOR_strcmp)
--3530-- REDIR: 0x4016fd0 (ld-linux-aarch64.so.1:index) redirected to
0x580c87c0 (vgPlain_arm64_linux_REDIR_FOR_index)
ERROR: ld.so: object
'/home/admin/valgrind-3.17.0/memcheck/vgpreload_core-arm64-linux.so' from
LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
--3530-- Reading syms from
/var/custom-configs/home/admin/valgrind-3.17.0/memcheck/vgpreload_memcheck-arm64-linux.so
--3530-- Reading syms from /usr/lib/libasound.so.2.0.0
--3530--    object doesn't have a symbol table
--3530-- Reading syms from /usr/lib/libpthread-2.28.so
--3530-- Reading syms from /usr/lib/libc-2.28.so
--3530-- Reading syms from /usr/lib/libm-2.28.so
--3530-- Reading syms from /usr/lib/libdl-2.28.so
--3530-- Reading syms from /usr/lib/librt-2.28.so

valgrind: m_redir.c:1195 (vgPlain_redir_do_lookup): Assertion 'iFuncWrapper'
failed.

host stacktrace:
==3530==    at 0x58046584: show_sched_status_wrk (m_libcassert.c:406)
==3530==    by 0x580466C3: report_and_quit (m_libcassert.c:477)
==3530==    by 0x58046823: vgPlain_assert_fail (m_libcassert.c:543)
==3530==    by 0x580C60F7: vgPlain_redir_do_lookup (m_redir.c:1195)
==3530==    by 0x58060E0F: vgPlain_translate (m_translate.c:1529)
==3530==    by 0x580A6867: handle_tt_miss (scheduler.c:1138)
==3530==    by 0x580A6867: vgPlain_scheduler (scheduler.c:1500)
==3530==    by 0x580F2EAB: thread_wrapper (syswrap-linux.c:101)
==3530==    by 0x580F2EAB: run_a_thread_NORETURN (syswrap-linux.c:154)
==3530==    by 0xFFFFFFFFFFFFFFFF: ???

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable (lwpid 3530)
==3530==    at 0x4A11778: memcpy (in /usr/lib/libc-2.28.so)
==3530==    by 0x400B2D7: _dl_relocate_object (in /usr/lib/ld-2.28.so)
==3530==    by 0x4003BEF: dl_main (in /usr/lib/ld-2.28.so)
==3530==    by 0x4014C57: _dl_sysdep_start (in /usr/lib/ld-2.28.so)
==3530==    by 0x40018CB: _dl_start_final (in /usr/lib/ld-2.28.so)
==3530==    by 0x4001B57: _dl_start (in /usr/lib/ld-2.28.so)
==3530==    by 0x4001047: ??? (in /usr/lib/ld-2.28.so)
client stack range: [0x1FFEFFE000 0x1FFF000FFF] client SP: 0x1FFEFFFCB0
valgrind stack range: [0x1008EB8000 0x1008FB7FFF] top usage: 14608 of 1048576


Note: see also the FAQ in the source distribution.
It contains workarounds to several common problems.
In particular, if Valgrind aborted or crashed after
identifying problems in your program, there's a good chance
that fixing those problems will prevent Valgrind aborting or

crashing, especially if it happened in m_mallocfree.c.

If that doesn't help, please report this bug to: www.valgrind.org

In the bug report, send all the above text, the valgrind
version, and what OS and version you are using.  Thanks.

EXPECTED RESULT
The expected result would be an error summary

SOFTWARE/OS VERSIONS
# uname -a
Linux apd-d8c0a6594e07 5.4.3-23.cm1 #1-mariner SMP PREEMPT Tue May 11 22:19:15
UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to