|
|
Log in / Subscribe / Register

LWN.net Weekly Edition for August 8, 2019

Welcome to the LWN.net Weekly Edition for August 8, 2019

This edition contains the following feature content:

This week's edition also includes these inner pages:

  • Brief items: Brief news items from throughout the community.
  • Announcements: Newsletters, conferences, security updates, patches, and more.

Please enjoy this week's edition, and, as always, thank you for supporting LWN.net.

Comments (none posted)

Escape sequences in Python strings

By Jake Edge
August 7, 2019

A change for Python 3.8—currently in beta—has produced some user-visible warnings, but the problem is often in code that a user cannot (or should not) change: third-party modules. The problem that the warning is trying to highlight is real, however. The upshot is that the handling of escape sequences (or non escape sequences, in truth) in Python string literals is in a rather messy state at this point.

Python string literals come in many different forms, but the main ones look like the following:

    a = 'foo'
    b = "bar"
    c = '''
    baz
    '''
The three-quote version allows for simpler multi-line strings and can use three double quotes instead if the programmer wants. But strings can also contain escape sequences, such as '\n' for newlines, '\t' for tabs, and so on. That means the backslash has a special meaning, so it needs to be escaped (i.e. '\\') if it is to be used literally, as well. A few other characters, notably a real newline or an embedded quote of the type used to delimit the string, also need to be backslash escaped.

But what to do about string literals with invalid escape sequences in them? A programmer who has put '\latex' as part of a string literal (to pick a not entirely random example) presumably actually wants '\\latex', which is what Python currently translates it to. Python does emit a DeprecationWarning in that case, but the warning was invisible by default until Python 3.7. However, that same programmer probably does not want '\tan(x)' to turn into a tab plus 'an(x)', but that is exactly what happens.

The change for Python 3.8 is to further elevate the warning to a SyntaxWarning, with plans to turn that into a SyntaxError in Python 3.9. A bug report filed in February 2018 shows the path of the change. But shortly after the Python 3.8 beta releases were made, Raymond Hettinger reported that he was seeing the warnings "pop up from time to time" from various third-party packages. Aaron Meurer concurred with Hettinger and pointed out a number of other problems he had encountered.

Serhiy Storchaka, who authored the patch for 3.8, replied that one of the examples given in the reports was in the PyParsing module, but that it showed a real problem that needed addressing, thus proving the usefulness of the change. A docstring in PyParsing referred to a regular expression, but did not escape the backslashes in the expression. The line in the docstring (delimited by ''') was:

    make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>")
Interestingly, the \1 and \2 were interpreted as octal characters with the values of 1 and 2 respectively, so they were effectively treated as Unicode code points U+0001 and U+0002. But, the presence of \w, which is not a legal escape sequence, triggered the warning.

In mid-July, Hettinger reported a problem he encountered with the Bottle web framework, where, once again, the warning was showing up, but in code his students could not change. He said: "I think it is poor form to bombard end-users with warnings about things they can't fix." Storchaka pointed out that the problem in Bottle resulted from a bad backport of a change made five years ago.

But even though the warning became visible in Python 3.7, it was still difficult for projects to see. The problem is that the warning is emitted when the .py file is compiled into a .pyc file and never shown after that point. For many projects, as Meurer pointed out, that means it is quite difficult to actually test for the presence of the warning, even when the projects are diligently looking for it:

My biggest issue is that the way Python warns about this makes it very difficult for library authors to fix this. Most won't even notice. The problem is the warnings are only shown once, when the file is compiled. So if you run the code in any way that causes Python to compile it, a further run of 'python -Wd' will show nothing. I don't know if it's reasonable, but it would be nice if Python recompiled when given -Wd, or somehow saved the warning so it could be shown if that flag is given later.

As an anecdote, for SymPy's CI, we went through five (if I am counting correctly) iterations of trying to test this. Each of the first four were subtly incorrect, until we finally managed to find the correct one (for reference, 'python -We:invalid -m compileall -f -q module/'). So most library authors who will attempt to add tests against this will get it wrong. Simply adding -Wd as you would expect is wrong. If the code is already compiled (which it probably is, e.g., if you ran setup.py), it won't show the warnings. At the very least the "correct" way to test this should be documented.

That led Nathaniel Smith to argue that the deprecation cycle was not really followed for these strings. He suggested perhaps storing these kinds of warnings in the .pyc file so that they could be emitted later, and not just at compilation time. Around the same time, Hettinger elevated the visibility of the problem with a post to the python-dev mailing list:

This once seemed like a reasonable and innocuous idea to me; however, I've been using the 3.8 beta heavily for a month and no longer think it is a good idea. The warning crops up frequently, often due to third-party packages (such as docutils and bottle) that users can't easily do anything about. And during live demos and student workshops, it is especially distracting.

I now think our cure is worse than the disease. If code currently has a non-raw string with '\latex', do we really need Python to yelp about it (for 3.8) or reject it entirely (for 3.9)?

He also noted that ASCII art in docstrings was affected and that Python had been living with its current behavior for nearly 30 years without any huge downside. The main problem that warning for illegal escape sequences is trying to solve is for file names on Windows systems, where the backslash is used as a directory separator, he said. Many of those problems cannot even be caught by the warning; his example was '..\training\new_memo.doc', which would produce a corrupted file name, but no warning. One solution for those types of strings is to use Python's raw strings: r'..\training\new_memo.doc'.

But Chris Angelico was concerned that allowing illegal escape sequences to pass silently is problematic. He did a quick survey of some other languages and found that most gave a warning (or, in the case of Lua, an error), but that all of the others just ignored the spurious \ entirely, rather than turning it into \\ as Python does. "IMO Python's solution is better, but Lua's is best. A bad escape is an error."

In general, the consensus in the thread seems to be to slow down the process of turning the warning into something that users see, at least until the developers of modules in the Python Package Index (PyPI) can address the problem. There were lots of suggestions for ways to find these strings automatically in ways that will be seen by the developers, but those will need to wait for the Python 3.9 cycle.

The behavior with escape sequences has other wrinkles, as Steven D'Aprano pointed out. For example, escaped non-delimiting quotes are treated differently than other escape sequences:

    py> "abc \d \' xyz"
    "abc \\d ' xyz"
That seems like a bug to him, though it is documented that way. The current behavior also precludes adding new escape sequences without multi-year deprecation dances. For example, \e is long established as the escape sequence for ESC, but adding it to Python is problematic "because it would break code that relies on '\e' being the same as '\\e'".

So D'Aprano believes a change needs to be made, but that the current pace is too fast: "This isn't a critical problem that needs to be fixed soonest." But Angelico is worried about simply kicking the can down the road. He would like to see some active steps be taken so that developers can see and fix these problems. The more-visible warning added for 3.8 serves that purpose but, as D'Aprano noted, there will likely be some undesirable effects of that, beyond just user unhappiness. Users will file bugs, for example, often without looking to see if there is an existing bug, and they may or may not file the bug in the right place. Furthermore: "The benefit of the desired change is relatively low."

While D'Aprano is generally in favor of giving warnings (and, presumably, eventually errors) for these illegal escape sequences, he was not convinced that it has been adequately justified. He mentioned that it would allow new escape sequences, but did not find that to be of huge benefit. Angelico was adamant, however, that the problem is larger than just blocking new escape sequences:

Python users on Windows get EXTREMELY confused by the way their code worked perfectly with one path, then bizarrely fails with another. That is a very real problem, and the problem is that it appeared to work when actually it was wrong.

Python has a history of fixing these problems. It used to be that b"\x61\x62\x63\x64" was equal to u"abcd", but now Python sees these as fundamentally different. Data-dependent bugs caused by a syntactic oddity are a language flaw that needs to be fixed.

Storchaka has submitted a pull request to revert his change that elevated the DeprecationWarning to a SyntaxWarning. Based on the mood in the thread, one would guess that will be merged, but, if the problem is truly going to be addressed, additional work will be needed. No one has suggested dropping the DeprecationWarning, though some seem to think there is marginal utility to changing the long-established "escape illegal escape sequences" feature. But it is clear that doing so without adequate warning causes problems of a different—and more user-visible—sort.

Comments (22 posted)

An end to implicit fall-throughs in the kernel

By Jonathan Corbet
August 1, 2019
The C switch statement has, since the beginning of the language, required the use of explicit break statements to prevent execution from falling through from one case to the next. This behavior can be a useful feature, allowing for more compact code, but it can also lead to bugs. The effort to rid the kernel of implicit fall-through coding patterns came to a conclusion with the 5.3-rc2 release, where the last cases were fixed. There is a good chance that these fixes will have to be redone in the future, though.

The problem with C's fall-through behavior is that it is implicit, with no indication of whether the behavior is intended or not. Developers learn (the hard way, sometimes) to end each case with a break statement as a matter of habit, but it's still an easy thing to forget, and the resulting code is seen by the compiler as being entirely valid. A forgotten break almost certainly introduces a bug, even if it might not manifest itself for years. Many developers have had reason to wish that the C language required an explicit indication by the programmer that fall-through behavior is desired.

Making fall-through behavior explicit

The GCC compiler has, for some time, offered a warning option (-Wimplicit-fallthrough) intended to catch missing break statements. It will trigger for any case that falls through into a succeeding case unless an explicit marker has been placed to indicate that the behavior is correct. It turns out that that there are many ways of placing this marker, depending on the value provided with -Wimplicit-fallthrough; the full set can be found in the GCC documentation. At its most lax, the presence of any comment at all prior to a case statement will allow warning-free fall-through into that case. Using -Wimplicit-fallthrough=3 causes the compiler to look for comments matching a fairly large set of regular expressions.

In the kernel, one is most likely to find comments that look like:

StyleCount
/* fallthrough */350
/* fall through */3,091
/* falls through */8
/* fall-through */167

Note that case was ignored in generating the above numbers, and that there are probably other variants in the code as well. All of those comment styles will be recognized by GCC with -Wimplicit-fallthrough=3 and will thus cause warnings to be suppressed.

As can be seen, there are a lot of these comments in the kernel source now, some of which date back to before the beginning of the Git era. Their number has increased in recent times, though, due mostly to a focused effort by Gustavo A. R. Silva, who has been working to eliminate every implicit fall-through warning in the kernel. The point of this effort, beyond fixing any bugs caused by missing break statements, is to make it possible to enable -Wimplicit-fallthrough=3 in the kernel build by default. As long as that option generates a pile of warnings, developers will ignore them and nobody will notice when new ones are added. Once the kernel is warning-free, though, it should be possible to keep it that way.

This work, which was supported by the Linux Foundation, has resulted in over 400 patches since 2017. As Silva has worked through the kernel source eliminating fall-through warnings, he has encountered (and fixed) a number of bugs. A quick search turns up the following commits, for example:

d64062b57eebdrm/amdgpu/gfx10: Fix missing break in switch statement
737298d18836drm/amdkfd: Fix missing break in switch statement
60747828eac2net: socket: Fix missing break in switch statement
84242b82d81crtlwifi: rtl8723ae: Fix missing break in switch statement
7850b51b6c21scsi: mpt3sas: Add missing breaks in switch statements
5e420fe63581scsi: aacraid: Fix missing break in switch statement
09186e503486security: mark expected switch fall-throughs and add a missing break
b5be853181a8crypto: ccree - fix missing break in switch statement
7264235ee74fIB/hfi1: Add missing break in switch statement
cc5034a5d293drm/radeon/evergreen_cs: fix missing break in switch statement
479826cc8611staging: comedi: ni_660x: fix missing break in switch statement
5340f23df8fegpio: sprd: Add missing break in switch statement
df997abeebadiscsi_ibft: Fix missing break in switch statement
2f10d8237396drm/amd/powerplay: Fix missing break in switch
307b00c5e695rtl8xxxu: Fix missing break in switch
5d25ff7a5448scsi: ips: fix missing break in switch
a7ed5b3e7dcastaging: comedi: tio: fix multiple missing break in switch bugs
c24bfa8f21b5spi: slave: Fix missing break in switch
ad0eaee6195dASoC: wm8994: Fix missing break in switch
9ba8376ce1e2ptp: fix missing break in switch
4e57562b4846iio: imu: inv_mpu6050: fix missing break in switch

The above list is clearly incomplete, though, since a number of the other fixes do not explicitly mention missing break statements in the subject line; see commit ed4ed4043a12, for example.

On July 27, a milestone of sorts was hit with this pull into the mainline from Silva's repository: the final implicit fall-through warning has been fixed, and -Wimplicit-fallthrough=3 is now the default for kernel builds. In other words, the kernel's coding style has just been tweaked to disallow the use of implicit fall-through in switch statements. It must be a satisfying conclusion to a long project.

Moving beyond comments

Naturally, though, some developers are not entirely happy with this change. Nobody who actually works in the kernel community seems to disagree with the idea of eliminating implicit fall-throughs, but the mechanism used to do so does not sit well with everybody; as Peter Zijlstra put it back in June: "I still consider it an abomination that the C parser looks at comments". Zijlstra, like others, would prefer that there were another way.

As it happens, there is another way. GCC starting with version 7 allows the use of a special attribute on a statement instead:

    __attribute__((fallthrough))

The use of this attribute can perhaps made more visually pleasing with a definition like:

    #define __fallthrough __attribute__((fallthrough))

The __fallthrough symbol could then be used instead of the magic comments to eliminate implicit fall-through warnings. A patch set implementing this option was posted by Miguel Ojeda in October 2018; it generated a fair amount of interest but was not adopted for a couple of reasons: it doesn't work with older versions of GCC, and the LLVM Clang compiler does not implement that attribute at all. Since Clang does successfully build the kernel in some settings (and is evidently used for the Android build), breaking it is not an appealing option.

The good news is that the Clang developers appear to be working on implementing this attribute. They also, it seems, have an implementation aimed at the proposed next standard for the C language, currently called C2X. The bad news is that the syntax there is different:

    [[fallthrough]]

If this version becomes an actual part of the C standard, it would probably be the preferable one to use going forward. But that may not be fully resolved for some time. In any case, the actual mechanism used to mark explicit fall-through behavior can be hidden behind a #define as shown above.

The one thing that can't be done is:

    #define __fallthrough /* fall through */

since the preprocessor will simply delete the comment rather than substituting it into the source. So the comments have to remain for now. But one can imagine that, at some point in the future when a better alternative is available, those thousands of comments are likely to be replaced with something like __fallthrough in a set of massive, tree-wide patches.

Meanwhile, though, the kernel has finally reached a point where there are no switch statements with implicit fall-through behavior, and the build process has been amended to prevent such behavior from being added in the future. One source of kernel bugs has been closed, a switch that can only be seen as a best-case scenario.

Comments (39 posted)

vDSO, 32-bit time, and seccomp

By Jonathan Corbet
August 2, 2019
The seccomp() mechanism is notoriously difficult to use. It also turns out to be easy to break unintentionally, as the development community discovered when a timekeeping change meant to address the year-2038 problem created a regression for seccomp() users in the 5.3 kernel. Work is underway to mitigate the problem for now, but seccomp() users on 32-bit systems are likely to have to change their configurations at some point.

The virtual dynamic shared object (vDSO) mechanism is an optimization provided by the kernel to reduce the cost of certain frequently used system calls. The vDSO is a small region of kernel-provided memory that is normally mapped into the address space of every user-space process; it contains implementations of system calls that can, in some circumstances at least, do their work in a user-space context. That allows the caller to avoid making a real system call and, thus, to avoid the cost of a context switch into kernel mode. System calls related to timekeeping, such as gettimeofday() are implemented in the vDSO, since they can often run quickly in user space and they tend to be called frequently.

The vDSO has generally been implemented in an architecture-specific way, even though the functions it performs are mostly the same across architectures. In the 5.2 development cycle, Vincenzo Frascino added a generic vDSO implementation that factored out much of the architecture-specific code into a single implementation that could be used on all architectures. During the 5.3 merge window, the x86 architecture switched over to the generic version, and all was well — or so it seemed.

seccomp() sadness

In mid-July, Sean Christopherson (among others) reported that the generic vDSO change broke some seccomp() users on 32-bit x86 systems. seccomp(), remember, allows user space to provide a BPF program (still "classic BPF", not eBPF as is used almost everywhere else in a contemporary Linux system) to control which system calls may be made. It is used to reduce the attack surface of code that might be exposed to attackers in one way or another; using it correctly is hard, but the number of users has been on the rise.

While the vDSO can usually implement timekeeping system calls in user space, that is not always possible. If the calling program wants an esoteric clock that has not been implemented, or if the timekeeping hardware available on the system is not amenable to vDSO access, then the vDSO must fall back to calling into the kernel. Prior to 5.3, the architecture-specific vDSO used the native clock_gettime() call on the system it was running on; that meant calling the 32-bit clock_gettime() on 32-bit kernels.

The 32-bit time format is, of course, going to run out of range in January 2038. Quite a bit of work has gone into preparing systems for this particular apocalypse, though much work still remains. Given this problem, adding new users of 32-bit time interfaces is a way to become rather unpopular in kernel-development circles, so the generic vDSO implementation naturally used clock_gettime64() as the fallback timekeeping system call on all architectures. That is not the sort of thing that one would ordinarily even have to think about much; nobody wants to create a generic vDSO implementation that contains yet another year-2038 problem in need of fixing.

But there is a problem here. A surprising number of programs want to know what time it is at some point or another. Anybody putting together a seccomp() policy for a given program will almost certainly allow system calls like gettimeofday(); otherwise the target program will probably break. A program that fails to run is generally secure, but users, being generally unreasonable, tend to get disgruntled anyway.

Any rational seccomp() policy will, thus, allow for the fallback system call when the vDSO is unable to provide the time directly. But it turns out that, while these policies allowed clock_gettime() on 32-bit systems, they lacked the foresight to let clock_gettime64() through as well. The end result is that, when a program protected by one of these seccomp() policies runs on a 5.3 kernel, it is quickly and rudely killed when it tries to make a disallowed system call.

Kernel developers might protest that this change is required to avoid year-2038 problems. They might also be naturally inclined to disregard lame excuses about how clock_gettime64() was never needed before, or about how that system call didn't even exist until the 5.1 release. But, in the end, this is a regression, and the kernel community's policy on such things is fairly unambiguous. Somehow, programs running under existing seccomp() policies will need to continue to work when the final 5.3 kernel comes out.

Fixing the problem

Various ideas were raised for how that could be done, starting with a not-entirely-serious suggestion that the generic vDSO change could simply be reverted. Perhaps seccomp() rules could be bypassed for system calls that originate in the vDSO; this idea didn't get far given that, among other things, faking a vDSO return address is not a difficult thing to do. Bypassing seccomp() for clock_gettime64() specifically is an option, but that would defeat administrators who want to block all access to timekeeping information. The concept of "system-call aliases" was circulated, initially by Andy Lutomirski; it would create a short list of "equivalent" system calls that take the same arguments and do the same thing. If one call in the list was rejected by a seccomp() filter, the kernel would retry the policy with any aliases that might exist.

The alias idea got further than many, but it has problems of its own. For example, authors of seccomp() policies might genuinely want to discriminate between "equivalent" system calls. It seems like the sort of mechanism that could generate surprising results in general. Aliases might still be the long-term solution for this problem but, as Lutomirski pointed out, "it's getting quite late to start inventing new seccomp features to fix this". Something simpler is needed, at least for the 5.3 release.

That something is likely to be based on this patch series from Thomas Gleixner, which simply causes the vDSO to fall back to the 32-bit clock_gettime() system call on 32-bit systems. It is a solution that is pleasing to nobody, but it solves the regression issue for now.

Some other solution will be required eventually; it is not possible to support 32-bit time indefinitely. One possibility is that the authors of seccomp() policies change their code to allow clock_gettime64() as well. But, even if that could be done and widely deployed, there is no strong incentive for developers to do this work, since their existing policies will continue to function as intended. Some sort of multi-year deprecation process could be considered as a way to force policies to be fixed. But the eventual solution may just have to live in seccomp() instead, perhaps in the form of an alias list or other special exception. A long-term solution that is pleasing to everybody is difficult to envision.

This situation highlights a problem with seccomp() in general: it is difficult to write robust policies at that level of detail, and the resulting policies tend to be brittle in the best of times. Even if the kernel community avoids incompatible changes, a change in a library somewhere can invoke a new system call that a given seccomp() policy may frown upon. While the OpenBSD pledge() mechanism may not offer the degree of control provided by seccomp(), its use of relatively broad categories of functionality makes it easier to avoid problems like this. But Linux has seccomp(), with all its power and complexity. It seems highly likely that developers will unwittingly run into this sort of regression again in the future.

Comments (54 posted)

Racket: Lisp for learning

By Jake Edge
August 6, 2019

Lisp is one of the oldest programming languages still in use today—Fortran is older by a year, but the Lisp community (or communities) seems to be the more dynamic of the two. In any case, the Lisp landscape has a lot of nooks and crannies to explore; I recently ran into a dialect that I had not encountered before: Racket. That may simply reflect ignorance on my part, but, while I was introduced to Lisp (too) many moons ago, I had not really paid it much mind until I sat in on a talk about Lisp at linux.conf.au earlier this year. Something about Racket caught my eye, so I did some poking around to see what it is all about.

The dynamism in the Lisp world also means that there are lots of projects, subprojects, dialects, descendants, and so on to keep straight. Lisp itself has split into three main dialects: Common Lisp, Scheme, and Clojure. Common Lisp and Scheme each have multiple implementations. Racket is based on Scheme; it was known as "PLT Scheme" (after the PLT organization behind the language) until version 5.0 was released in 2010.

Descended from Scheme

So Racket is a Scheme descendant, but not a Scheme implementation. It is described on its home page as a cross-platform, general-purpose language, but one with a focus on language-oriented programming. The Racket Manifesto goes even further down that path:

First, programming is about stating and solving problems, and this activity normally takes place in a context with its own language of discourse; good programmers ought to formulate this language as a programming language. Hence, Racket is a programming language for creating new programming languages.

And, in fact, there are already multiple languages defined for Racket, including a web-application language; a logic-based language similar to Prolog, datalog; Scribble for generating HTML and PDF documentation; and more. Racket, like Python, advertises itself as a "batteries included" language, with a standard library that contains many different useful modules, including for graphics and GUIs, networking, format parsing, left-pad, and so on; the Racket Documentation page has links to the ecosystem's extensive documentation.

Racket was created in part to further the educational aims of its developers, who are largely computer science professors and graduate students. The How to Design Programs textbook is based around Racket programming and its integrated development environment (IDE), but does not actually teach Racket itself. It starts with the Beginning Student Language (BSL) and moves on to various more advanced dialects; these languages are targeted at novice programmers and, in particular, ensuring that error diagnosis is usable by beginners. As a note in the preface puts it:

The teaching languages are implemented in Racket, a programming language we built for building programming languages. Racket has escaped from the lab into the real world, and it is a programming vehicle of choice in a variety of settings, from gaming to the control of telescope arrays. Although the teaching languages borrow elements from the Racket language, this book does not teach Racket. Then again, a student who has completed this book can easily move on to Racket.

DrRacket

The IDE is DrRacket, which provides an interactive read-eval-print loop (REPL) in the "interactions window" and an editor for programs in the "definitions window", as can be seen in the screen shot below. The definitions window is at the top (with the rocket and LWN penguin), half obscured by the help information, which has been locked in place. The interactions window is at the bottom; it shows an arrow in the upper right that leads to help text (which can be locked in place as was done above). Graphical elements are handled like any other data type; the Quick introduction provides a kind of overview of the language using graphics, stepping through the major features of the language (which are, unsurprisingly, Lisp-like). It works its way up through binding, functions, macros, and so on, ending up with a brief look at the object system in the guise of the GUI library.

[DrRacket]

That introduction uses the "#lang slideshow" dialect of Racket; in general, "#lang" is used in the definitions window to say which language is being used. #lang racket is the standard dialect, though "typed/racket", "racket/gui", "web-server/insta", "datalog", and many others can be specified there. As one would guess, DrRacket has helpful parenthesis-handling features, syntax highlighting, debugging tools, and more. It is geared toward newbies, but does not look to be too "dumbed down" for those with more experience.

All of the different languages and dialects of Racket are a bit confusing, at least for this (relative) newbie, but it gets even further complicated. There is a new version of Racket under development that sits atop Chez Scheme instead of the existing C-based version; it is known as "Racket on Chez Scheme" or just "Racket CS". It is meant to eventually become the standard Racket, in large part because it will make for a more maintainable code base, according to the original project announcement in 2017 and the January 2019 progress report. Racket CS will be largely compatible with Racket, but there will be exceptions (particularly for extensions that use the C API), so the existing Racket implementation will still be maintained.

All of that means that users will have a choice when installing Racket, starting with the upcoming 7.4 release. Racket CS will be available as a beta download when the new version comes out. For Linux users who want to try Racket out, it is available for most distributions (e.g. Racket 7.0 for Fedora 29); if the most recent release is desired, it is available in binary form via a shell script installer. The source code for Racket is on GitHub; it is available under the LGPLv3. Racket is also a member project of the Software Freedom Conservancy

Parting thoughts

Racket is a daunting project to dip into. As with any overview, this one barely scratches the surface of what Racket has to offer. For those looking for a Lisp-like language to explore, Racket looks like a good choice; the documentation, textbook, and multiple domain-specific tutorials means that there is a wealth of information to digest and apply. The textbook, in particular, looks like something I will try to find some time to dig further into; I may not have truly grokked Lisp the first time around, but Racket may provide another opportunity to do so.

Comments (1 posted)

The Compact C Type Format in the GNU toolchain

By Jonathan Corbet
August 6, 2019

OSS Japan
The Compact C Type Format (CTF) is a way of representing information about a binary program; it can be seen as a simpler alternative to the widely used DWARF format. While CTF has been around for some years, it has not seen much use in the Linux world. According to Elena Zannoni, who talked about CTF at the 2019 Open Source Summit Japan, that situation may be about to change; work is underway to bring CTF support to the GNU tools shipped universally with Linux systems.

Compiling a program into its binary form discards a lot of information found in the source code; that information can be needed when the time comes to track down a bug in the compiled program. To facilitate this work, compilers create debugging information that records the names and types of the variables used by a program, along with function names, the line numbers in the source program, and more; this information is then stored in one of many formats. DWARF is by far the most commonly used format on Unix-like systems, but it is not the only one.

Given the dominance of DWARF, one might wonder why anyone would want to work on alternatives. One problem is that DWARF is complex; rather than containing straightforward information about a program, a DWARF entry is essentially a program in its own right that can be run to generate the [Elena Zannoni] needed information. That makes DWARF flexible, but it's also complicated and verbose; the DWARF data associated with a program can be huge. That size means that, on most systems, the DWARF data for the installed programs is relegated to "debuginfo" packages that are not even present unless the owner has gone out of their way to install them.

CTF was created out of a desire to be able to perform most debugging tasks even in the absence of debuginfo packages, and to be able to do so in a simpler and faster way. DWARF can also expose a lot of information about the program source that some companies might wish to keep to themselves; CTF contains a lot less unneeded information. The CTF format was first created for the Solaris system, but has been used with the Linux DTrace port since 2012. There is, she said, nothing DTrace-specific about CTF, though. It is also available on FreeBSD and macOS.

The key difference between CTF and DWARF, perhaps, is that CTF limits itself to modeling the type system and managing the mapping from symbol-table entries to specific types. DWARF is much more ambitious, she said, modeling everything relating to the C language and how it maps to the hardware. CTF's simplicity means it can omit location lists, stack machines, and a lot of other machinery.

Bringing CTF to Linux requires contributing a lot of code upstream. One piece of the puzzle is adding support to GCC; the new -gt option will cause the compiler to generate CTF data. Getting that data into the final executable requires support in the binutils package as well; this includes enhancing the linker as well as adding support to tools like objdump and readelf. Work is also being done to get CTF support into the GDB debugger. Zannoni showed some sample output from the size utility; the CTF data (stored in an ELF section named .ctf) required about 213KB of space, as compared to over 4MB for the DWARF data for the same program. DWARF data for the kernel requires 1.6GB; the CTF data fits in just under 7MB.

CTF and DWARF data can coexist in the same ELF file, she said, since the CTF data has its own dedicated section. The CTF data is naturally smaller, but the format also includes compression to reduce the size requirements further. The result is that this data, unlike DWARF information, need not be stripped to get the executable file down to a reasonable size. Thus, while DWARF data is normally shipped in separate debuginfo packages, CTF data is easily included in the binary package and can be always available.

Internally, CTF data is stored in a structure called a "container" or a "dictionary". Each dictionary contains a header and a number of subsections dedicated to data like function information, variable information, types, and a string table for names not already present in the ELF string table. The header starts with a magic number (useful for determining the endianness of the rest of the data), a version number, and a set of flags. Version one is the original Solaris CTF, while version two was created during the porting of DTrace to Linux. It mostly increases a number of limits found in the first version. The third version is still being defined; it will include a number of header changes among other things. There is even a fourth version in an "initial planning stage". The intent is to keep this data ABI compatible, though, she said.

Returning to linker support, Zannoni noted that GCC will place a single .ctf section in each object file it creates. The linker then has to take these sections and merge them into a larger section, removing any duplicate information. There is a potential problem, though, in that different object files may define conflicting objects using the same names. When this happens, the linker will create a child dictionary associated with a specific translation unit for the conflicting data. Most of the time, though, a linked executable will contain one large shared CTF dictionary and perhaps a small number of tiny subdictionaries.

There is a libctf library being added to the binutils package that implements the ability to read and write CTF data; it is used by the compiler, the linker, and the debugger. This library, along with the readelf and objdump changes, were merged into the binutils trunk in May; the linker changes have been posted but need some more work before they can be merged. The hope is that all of the CTF support will land in binutils for the upcoming 2.33 release.

The GCC patches have been posted a few times; they too are being modified in response to review comments. One piece that has not yet been posted is link-time optimization support, but it is coming soon. With luck, she said, all of this support will be merged in time for the GCC 10 release due in 2020. GDB support is also under discussion on the project mailing list; the GDB 8.4 release is being targeted for this work.

Zannoni closed with a look at where things go from here. There is a set of discussions planned for the Toolchains microconference at the 2019 Linux Plumbers Conference. There are, evidently, still optimizations that can be made to further reduce the size of CTF data. There is also a fairly significant gap in that backtrace support is not yet present for CTF. An expansion to languages other than C is on the horizon. Then, there is that perennial lowest priority for development teams: documentation. The "specification" for the format lives in a C header file for now; that will clearly need to change in the future.

[Your editor thanks the Linux Foundation for supporting his travel to the event.]

Comments (86 posted)

Mozilla's WebThings Gateway now available for Turris Omnia router

By Jake Edge
August 7, 2019

The "Web of Things" (WoT) is meant as a way to enable Internet of Things (IoT) devices to appear on the web. Mozilla's entry into the WoT world is the WebThings project, which consists of both a Framework API and a Gateway software distribution to host applications. On July 25, the project announced the Gateway 0.9 release with support for the Turris Omnia wireless home router.

Back in April, Mozilla announced that its "Things" project for IoT had graduated from an experiment into WebThings. That project is billed as "an open platform for monitoring and controlling devices over the web". At that time, the Gateway software only targeted Raspberry Pi devices, but the new release moves into the consumer-hardware world. In addition, support for the new Raspberry Pi 4 has been added.

The Gateway is based on the OpenWrt router distribution, which has been modified to add the IoT-specific functionality. It is currently somewhat limited in its functionality, however:

So far, these experimental builds only offer extremely basic router configuration and are not ready to replace your existing wireless router. This is just our first step along the path to creating a full software distribution for wireless routers.

There are guides for installing Gateway for the Turris Omnia and for Raspberry Pi. Beyond media to use for the installation image (or to boot from for the Raspberry Pi), the main hardware requirement is for USB adapters to allow communication using the Zigbee and Z-Wave "smart home protocols". Which will be needed depends on what IoT-enabled devices are installed.

Once it has booted for the first time, the Gateway software will bring up a wireless network that users will connect to. After that, the first-time setup is performed from a web browser on a connected device. Mozilla runs a tunneling service that the user can sign up for, which will give them a host name in the mozilla-iot.org domain that can be used to reach the Gateway. The final piece of the initial configuration is to add a user account; after that, the WebThings Gateway User Guide provides information on configuring the router to talk to the IoT devices of interest.

[Floor plan]

The first step for adding devices is to put them in a mode that is receptive to a new pairing, one at a time, then to tell the Gateway web application to scan for them. Once they are recognized (and renamed to something that makes more sense to the user), there are a number of different options. The device state can be queried (e.g. is a door open or a light on) or changed, for example; some devices may require an add-on in order to access them. Users can also create a floor plan of their house to place icons of the devices in the right locations.

Beyond that, there is a rules engine where automated changes can be programmed. So if the user wants a certain light to go on or off at a specific time, for example, that can be done. The interface is icon oriented, which should make it easier for less technical users. There is also an experimental Smart Assistant feature that allows voice or typed commands like "turn on the kitchen light" to be handled. The voice data is sent to Google's voice assistant API; the text commands are handled locally on the Gateway device. It is not clear why the assistant is not using Mozilla's speech-processing engine.

New for version 0.9 is a Notifier add-on that will send an email or SMS text message based on rules that the user specifies, so motion sensor activity could trigger a text message, for example. Accompanying the Gateway release is the 0.12 release of the WebThings Framework. It has made some changes to the Web Thing API to more closely align it with the recent W3C WoT Thing Description draft.

Centralizing IoT handling on a system controlled by the user is an admirable goal. The IoT world has so far proven to be an insecure morass of competing lock-in plays, or so it seems to this cynical observer. Wresting control of the devices from the manufacturers and placing it in the hands of their owners seems like an excellent step forward. Hopefully Mozilla sticks with this project for the long haul and that it gets the community support that it surely deserves—and needs.

Comments (6 posted)

Page editor: Jonathan Corbet

Brief items

Security

Security quote of the week

Plans to "break up" big tech just creates a few more data silos and effectively locks in some pre-selected (slightly smaller) giants, thanks to network effects. What the Data Transfer Project does is flip the equation. It makes it so that more competition can thrive without taking away the network effects that make the internet so powerful. It's the most interesting, and most compelling approach to generating actual competition among internet services.

I still hope that the project goes even further in knocking down silos and opening up for competition, but it's already quite encouraging. Of course, it got almost no attention at all because anti-trust is sexy, whereas companies opening themselves up to competition through technological means is apparently boring.

— Mike Masnick on the Data Transfer Project

Comments (1 posted)

Kernel development

Kernel release status

The current development kernel is 5.3-rc3, released on August 4. Linus said: "Interesting. Last Sunday, rc2 was fairly large to match the biggish merge window, but this last week has actually been quite calm, and rc3 is actually smaller than usual, and smaller than rc2 was"

Stable updates: 5.2.6, 4.19.64, 4.14.136, 4.9.187, and 4.4.187 were released on August 4, followed by 5.2.7, 4.19.65, 4.14.137, 4.9.188, and 4.4.188 on August 6.

Comments (none posted)

Distributions

Freedombone 4.0 released

Freedombone 4.0 is available. Freedombone is a distribution (based on Debian 10) focused on the hosting network services under one's own control on home servers. "There is no freedom without freedom of association. That is, having the ability to define who you are and what kind of community you want to live in. This release includes Community Networks as an initial step towards networks run by and for the people who use them." Support for the Wireguard VPN has been added, but the "Fediverse" applications (GNU Social, PostActiv, and Pleroma) have been removed as being too hard to manage.

Comments (5 posted)

Red Hat Enterprise Linux 7.7 released

Red Hat has announced the release of Red Hat Enterprise Linux 7.7. "Beyond new capabilities, Red Hat Enterprise Linux 7.7 also marks the transition of Red Hat Enterprise Linux 7 to Maintenance Phase I within the Red Hat Enterprise Linux 10-year lifecycle. Maintenance Phase I emphasizes maintaining infrastructure stability for production environments and enhancing the reliability of the operating system. Future minor releases of Red Hat Enterprise Linux 7 will now focus solely on retaining and improving this stability rather than net-new features."

Comments (1 posted)

Distribution quote of the week

Seeing that some people out there in the world have installed and are using a package that I maintain in Debian makes me happy. I think we shouldn't underestimate the pure psychological value of that, even if it's hard to attribute specific meaning to the statistics.
— Russ Allbery

Comments (none posted)

Development

FFmpeg 4.2 released

Version 4.2 of the FFmpeg multimedia framework is out. It features a long list of new filters and decoders, including a long-awaited AV1 decoder.

Comments (1 posted)

The GNU C Library version 2.30 is now available

Version 2.30 of the GNU C Library (glibc) has been released. New features include Unicode 12.1.0 support; wrappers for the getdents64(), gettid(), and tgkill() system calls on Linux; addition of a bunch of POSIX-proposed pthreads calls; protections for memory allocation functions so that they cannot cause ptrdiff_t overflows; and more, such as fixes for two security problems:

CVE-2019-7309: x86-64 memcmp used signed Jcc instructions to check size. For x86-64, memcmp on an object size larger than SSIZE_MAX has undefined behavior. On x32, the size_t argument may be passed in the lower 32 bits of the 64-bit RDX register with non-zero upper 32 bits. When it happened with the sign bit of RDX register set, memcmp gave the wrong result since it treated the size argument as zero. Reported by H.J. Lu.

CVE-2019-9169: Attempted case-insensitive regular-expression match via proceed_next_node in posix/regexec.c leads to heap-based buffer over-read. Reported by Hongxu Chen.

Full Story (comments: 15)

GNOME and KDE to co-host the Linux App Summit in November

The GNOME and KDE projects are teaming up to host the Linux App Summit (LAS) that will be held in Barcelona, November 12-15. "LAS is the first collaborative event co-hosted by the two organizations since the Desktop Summit in 2009. Both organizations are eager to bring their communities together in building an application ecosystem that transcends individual distros and broadens the market for everyone involved. KDE and GNOME will no longer be taking a passive role in the free desktop sector. With the joint influence of the two desktop projects, LAS will shepherd the growth of the FOSS desktop by encouraging the creation of quality applications, seeking opportunities for compensation for FOSS developers, and fostering a vibrant market for the Linux operating system." The CfP is open until August 31.

Full Story (comments: none)

Knoll: Technical vision for Qt 6

Lars Knoll describes the goals for the next major version of the Qt graphics toolkit. "Qt has been growing a lot over the last years, to the point where delivering a new version of it is a major undertaking. With Qt 6 there is an opportunity to restructure our product offering and have a smaller core product that contains the essential frameworks and tooling. We will use the market place to deliver our add-on frameworks and tools, not as a tightly coupled bundle with the core Qt product."

Comments (16 posted)

Miscellaneous

FSFE releases the REUSE 3.0 copyright/licensing specification

The Free Software Foundation Europe has an announcement about the release of the REUSE 3.0 specification. "The licensing of a software project is critical information. Developers set the terms under which others can reuse their software, from individuals to giant corporations. Authors want to make sure that others adhere to their chosen licenses; potential re-users have to know the license of third-party software before publication; and companies have to ensure license compliance in their products that often build on top of existing projects. The REUSE project, led by the Free Software Foundation Europe (FSFE), helps all of these parties."

Comments (none posted)

Page editor: Jake Edge

Announcements

Newsletters

Distributions and system administration

Development

Meeting minutes

Calls for Presentations

CFP Deadlines: August 8, 2019 to October 7, 2019

The following listing of CFP deadlines is taken from the LWN.net CFP Calendar.

DeadlineEvent Dates EventLocation
August 11 January 13
January 17
linux.conf.au Gold Coast, Australia
August 17 November 1
November 2
Ohio LinuxFest 2019 Columbus, OH, USA
August 18 November 19
November 20
DevOpsDays Galway 2019 Galway, Ireland
August 30 October 10
October 11
PyCon ZA 2019 Johannesburg, South Africa
August 31 November 12
November 15
Linux Application Summit Barcelona, Spain
August 31 November 7 Open Source Camp | #4 Foreman Nuremberg, Germany
September 2 October 3 PostgresqlConf South Africa Cape Town, South Africa
September 9 October 26 FOSS XR Conference Amsterdam, The Netherlands
September 13 October 26 The Future is Open Rochester, NY, USA
September 14 October 31 Real-time Linux Summit - At ELCE 2019 Lyon, France
September 16 November 4
November 8
Tcl 2019 - 26th Annual Tcl/Tk Conference Houston, TX, USA
September 22 December 9 Open FinTech Forum New York, NY, USA
October 2 November 2
November 3
OpenFest 2019 Sofia, Bulgaria
October 4 November 2
November 3
Konference OpenAlt Brno, Czechia
October 6 November 16
November 17
Capitole du Libre 2019 Toulouse, France

If the CFP deadline for your event does not appear here, please tell us about it.

Upcoming Events

Events: August 8, 2019 to October 7, 2019

The following event listing is taken from the LWN.net Calendar.

Date(s)EventLocation
August 6
August 10
PyCon Africa Accra, Ghana
August 8
August 11
Flock To Fedora Budapest, Hungary
August 10
August 11
FrOSCon 2019 St. Augustin (near Cologne), Germany
August 17 FOSScon 2019 Philadelphia, PA, USA
August 17
August 18
Conference for Open Source Coders, Users & Promoters Taipei, Taiwan
August 19
August 21
Linux Security Summit San Diego, CA, USA
August 20 Tracing Summit 2019 San Diego, CA, USA
August 21
August 23
Open Source Summit North America San Diego, CA, USA
August 21
August 23
Embedded Linux Conference NA San Diego, CA, USA
August 21
August 25
Chaos Communication Camp Zehdenick, Germany
August 22
August 23
Rust Conf Portland, Oregon, USA
August 23
August 28
GNOME User and Developer Conference Thessaloniki, Greece
August 26
August 30
FOSS4G 2019 Bucharest, Romania
September 2
September 6
EuroSciPy 2019 Bilbao, Spain
September 3
September 6
Open Source Firmware Conference 2019 Sunnyvale & Menlo Park, CA, USA
September 4
September 6
GNU Hackers Meet Madrid, Spain
September 6
September 9
PyColorado Denver, CO, USA
September 7
September 13
Akademy 2019 Milan, Italy
September 9
September 11
Linux Plumbers Conference Lisbon, Portugal
September 9
September 11
HashiConf 2019 Seattle, WA, USA
September 11
September 13
PostgresOpen Orlando, FL, USA
September 11
September 12
Cloud Foundry Summit Europe The Hague, The Netherlands
September 11
September 13
LibreOffice Conference Almeria, Spain
September 12 Kernel Maintainer Summit Lisbon, Portugal
September 12
September 15
GNU Tools Cauldron Montreal, Canada
September 16
September 20
GNU Radio Conference 2019 Huntsville, AL, USA
September 19
September 20
DPDK Userspace 2019 Bordeaux, France
September 20
September 22
All Systems Go! 2019 Berlin, Germany
September 21 Central Pennsylvania Open Source Conference Lancaster, PA, USA
September 21
September 23
State of the Map Heidelberg, Germany
September 23
September 24
Lustre Administrator and Developer Workshop 2019 Paris, France
September 23
September 25
Open Networking Summit Antwerp, Belgium
September 25
September 27
Kernel Recipes Paris, France
October 1
October 4
Alpine Linux Persistence and Storage Summit Lizumerhütte, Tyrol, Austria
October 2 OpenInfra Days Italy 2019 Milan, Italy
October 2
October 4
X.Org Developer's Conference Montreal, Canada
October 3 OpenInfra Days Italy 2019 Rome, Italy
October 4
October 5
Linux Piter 2019 Saint Petersburg, Russia
October 5
October 6
openSUSE.Asia Summit Bali, Indonesia

If your event does not appear here, please tell us about it.

Security updates

Alert summary August 1, 2019 to August 7, 2019

Dist. ID Release Package Date
Arch Linux ASA-201908-1 chromium 2019-08-05
CentOS CESA-2019:1898 C7 httpd 2019-07-31
CentOS CESA-2019:1884 C7 libssh2 2019-07-31
CentOS CESA-2019:1883 C7 qemu-kvm 2019-07-31
Debian DLA-1869-1 LTS firefox-esr 2019-08-02
Debian DLA-1866-1 LTS glib2.0 2019-07-31
Debian DLA-1866-2 LTS glib2.0 2019-08-06
Debian DSA-4491-1 stable proftpd-dfsg 2019-08-04
Debian DLA-1872-1 LTS python-django 2019-08-06
Debian DLA-1868-1 LTS squirrelmail 2019-08-01
Debian DSA-4490-1 stable subversion 2019-07-31
Debian DLA-1870-1 LTS thunderbird 2019-08-02
Debian DLA-1871-1 LTS vim 2019-08-03
Debian DLA-1867-1 LTS wpa 2019-08-01
Fedora FEDORA-2019-e6b02af8b8 F29 gvfs 2019-08-06
Fedora FEDORA-2019-d6bc3771a4 F29 hostapd 2019-08-07
Fedora FEDORA-2019-56a658c60c F29 java-11-openjdk 2019-08-04
Fedora FEDORA-2019-a9825cfb3d F30 java-11-openjdk 2019-08-03
Fedora FEDORA-2019-7aecfe1c4b F30 kernel 2019-08-06
Fedora FEDORA-2019-7aecfe1c4b F30 kernel-headers 2019-08-06
Fedora FEDORA-2019-7aecfe1c4b F30 kernel-tools 2019-08-06
Fedora FEDORA-2019-80f1943143 F30 matrix-synapse 2019-08-04
Fedora FEDORA-2019-e9187610c3 F30 proftpd 2019-08-01
Fedora FEDORA-2019-f6bc68e455 F30 subversion 2019-08-06
Gentoo 201908-01 binutils 2019-08-03
Gentoo 201908-02 libpng 2019-08-03
Mageia MGASA-2019-0217 7 kernel 2019-08-03
openSUSE openSUSE-SU-2019:1834-1 15.0 aubio 2019-08-06
openSUSE openSUSE-SU-2019:1826-1 15.1 openexr 2019-08-01
openSUSE openSUSE-SU-2019:1824-1 15.1 rmt-server 2019-08-01
openSUSE openSUSE-SU-2019:1831-1 15.0 spamassassin 2019-08-06
Oracle ELSA-2019-1527 OL8 WALinuxAgent 2019-08-01
Oracle ELSA-2019-1714 OL8 bind 2019-08-01
Oracle ELSA-2019-1145 OL8 bind 2019-08-01
Oracle ELSA-2019-0975 OL8 container-tools:rhel8 2019-08-01
Oracle ELSA-2019-1771 OL8 cyrus-imapd 2019-08-01
Oracle ELSA-2019-1259 OL8 dotnet 2019-08-01
Oracle ELSA-2019-0968 OL8 edk2 2019-08-01
Oracle ELSA-2019-1269 OL8 firefox 2019-08-01
Oracle ELSA-2019-1696 OL8 firefox 2019-08-01
Oracle ELSA-2019-1764 OL8 firefox 2019-08-01
Oracle ELSA-2019-1143 OL8 flatpak 2019-08-01
Oracle ELSA-2019-1142 OL8 freeradius:3.0 2019-08-01
Oracle ELSA-2019-0971 OL8 ghostscript 2019-08-01
Oracle ELSA-2019-1517 OL8 gvfs 2019-08-01
Oracle ELSA-2019-0980 OL8 httpd:2.4 2019-08-01
Oracle ELSA-2019-2003 OL7 icedtea-web 2019-08-01
Oracle ELSA-2019-2003 OL7 icedtea-web 2019-07-31
Oracle ELSA-2019-2004 OL8 icedtea-web 2019-08-06
Oracle ELSA-2019-1146 OL8 java-1.8.0-openjdk 2019-08-01
Oracle ELSA-2019-1816 OL8 java-1.8.0-openjdk 2019-08-01
Oracle ELSA-2019-1817 OL8 java-11-openjdk 2019-08-01
Oracle ELSA-2019-1518 OL8 java-11-openjdk 2019-08-01
Oracle ELSA-2019-4735 OL6 kernel 2019-08-06
Oracle ELSA-2019-4733 OL7 kernel 2019-08-06
Oracle ELSA-2019-4735 OL7 kernel 2019-08-06
Oracle ELSA-2019-1479 OL8 kernel 2019-08-01
Oracle ELSA-2019-1167 OL8 kernel 2019-08-01
Oracle ELSA-2019-0985 OL8 mod_auth_mellon 2019-08-01
Oracle ELSA-2019-1951 OL8 nss and nspr 2019-08-06
Oracle ELSA-2019-1279 OL8 pacemaker 2019-08-01
Oracle ELSA-2019-1529 OL8 pki-deps:10.6 2019-08-01
Oracle ELSA-2019-1152 OL8 python-jinja2 2019-08-01
Oracle ELSA-2019-0981 OL8 python27:2.7 2019-08-01
Oracle ELSA-2019-0997 OL8 python3 2019-08-01
Oracle ELSA-2019-0984 OL8 python36:3.6 2019-08-01
Oracle ELSA-2019-1972 OL8 ruby:2.5 2019-08-06
Oracle ELSA-2019-0990 OL8 systemd 2019-08-01
Oracle ELSA-2019-1144 OL8 thunderbird 2019-08-01
Oracle ELSA-2019-1308 OL8 thunderbird 2019-08-01
Oracle ELSA-2019-1799 OL8 thunderbird 2019-08-01
Oracle ELSA-2019-1623 OL8 thunderbird 2019-08-01
Oracle ELSA-2019-1619 OL8 vim 2019-08-01
Oracle ELSA-2019-1268 OL8 virt:rhel 2019-08-01
Oracle ELSA-2019-1175 OL8 virt:rhel 2019-08-01
Oracle ELSA-2019-0983 OL8 wget 2019-08-01
Red Hat RHSA-2019:2079-01 EL7 Xorg 2019-08-06
Red Hat RHSA-2019:2332-01 EL7 advancecomp 2019-08-06
Red Hat RHSA-2019:2403-01 EL7.3 augeas 2019-08-07
Red Hat RHSA-2019:2057-01 EL7 bind 2019-08-06
Red Hat RHSA-2019:2075-01 EL7 binutils 2019-08-06
Red Hat RHSA-2019:2162-01 EL7 blktrace 2019-08-06
Red Hat RHSA-2019:2051-01 EL7 compat-libtiff3 2019-08-06
Red Hat RHSA-2019:2181-01 EL7 curl 2019-08-06
Red Hat RHSA-2019:2060-01 EL7 dhcp 2019-08-06
Red Hat RHSA-2019:2197-01 EL7 elfutils 2019-08-06
Red Hat RHSA-2019:2048-01 EL7 exempi 2019-08-06
Red Hat RHSA-2019:2101-01 EL7 exiv2 2019-08-06
Red Hat RHSA-2019:2037-01 EL7 fence-agents 2019-08-06
Red Hat RHSA-2019:2157-01 EL7 freerdp and vinagre 2019-08-06
Red Hat RHSA-2019:2281-01 EL7 ghostscript 2019-08-06
Red Hat RHSA-2019:2118-01 EL7 glibc 2019-08-06
Red Hat RHSA-2019:2145-01 EL7 gvfs 2019-08-06
Red Hat RHSA-2019:2258-01 EL7 http-parser 2019-08-06
Red Hat RHSA-2019:2343-01 EL7 httpd 2019-08-06
Red Hat RHSA-2019:2003-01 EL7 icedtea-web 2019-07-31
Red Hat RHSA-2019:2004-01 EL8 icedtea-web 2019-07-31
Red Hat RHSA-2019:2141-01 EL7 kde-workspace 2019-08-06
Red Hat RHSA-2019:2285-01 EL7 keepalived 2019-08-06
Red Hat RHSA-2019:2029-01 EL7 kernel 2019-08-06
Red Hat RHSA-2019:2043-01 EL7 kernel-rt 2019-08-06
Red Hat RHSA-2019:2405-01 EL8 kernel-rt 2019-08-07
Red Hat RHSA-2019:2137-01 EL7 keycloak-httpd-client-install 2019-08-06
Red Hat RHSA-2019:2298-01 EL7 libarchive 2019-08-06
Red Hat RHSA-2019:2047-01 EL7 libcgroup 2019-08-06
Red Hat RHSA-2019:2308-01 EL7 libguestfs-winsupport 2019-08-06
Red Hat RHSA-2019:2052-01 EL7 libjpeg-turbo 2019-08-06
Red Hat RHSA-2019:2049-01 EL7 libmspack 2019-08-06
Red Hat RHSA-2019:2130-01 EL7 libreoffice 2019-08-06
Red Hat RHSA-2019:2290-01 EL7 libsolv 2019-08-06
Red Hat RHSA-2019:2136-01 EL7 libssh2 2019-08-06
Red Hat RHSA-2019:2399-01 EL7.3 libssh2 2019-08-07
Red Hat RHSA-2019:2053-01 EL7 libtiff 2019-08-06
Red Hat RHSA-2019:2294-01 EL7 libvirt 2019-08-06
Red Hat RHSA-2019:2126-01 EL7 libwpd 2019-08-06
Red Hat RHSA-2019:2169-01 EL7 linux-firmware 2019-08-06
Red Hat RHSA-2019:2327-01 EL7 mariadb 2019-08-06
Red Hat RHSA-2019:2276-01 EL7 mercurial 2019-08-06
Red Hat RHSA-2019:2112-01 EL7 mod_auth_openidc 2019-08-06
Red Hat RHSA-2019:2237-01 EL7 nss, nss-softokn, nss-util, and nspr 2019-08-06
Red Hat RHSA-2019:2077-01 EL7 ntp 2019-08-06
Red Hat RHSA-2019:2154-01 EL7 opensc 2019-08-06
Red Hat RHSA-2019:2143-01 EL7 openssh 2019-08-06
Red Hat RHSA-2019:2304-01 EL7 openssl 2019-08-06
Red Hat RHSA-2019:2125-01 EL7 ovmf 2019-08-06
Red Hat RHSA-2019:2033-01 EL7 patch 2019-08-06
Red Hat RHSA-2019:2097-01 EL7 perl-Archive-Tar 2019-08-06
Red Hat RHSA-2019:2400-01 EL7.3 perl 2019-08-07
Red Hat RHSA-2019:2046-01 EL7 polkit 2019-08-06
Red Hat RHSA-2019:2022-01 EL7 poppler 2019-08-06
Red Hat RHSA-2019:2189-01 EL7 procps-ng 2019-08-06
Red Hat RHSA-2019:2401-01 EL7.3 procps-ng 2019-08-07
Red Hat RHSA-2019:2030-01 EL7 python 2019-08-06
Red Hat RHSA-2019:2035-01 EL7 python-requests 2019-08-06
Red Hat RHSA-2019:2272-01 EL7 python-urllib3 2019-08-06
Red Hat RHSA-2019:2078-01 EL7 qemu-kvm 2019-08-06
Red Hat RHSA-2019:2166-01 EL7 qemu-kvm-ma 2019-08-06
Red Hat RHSA-2019:2135-01 EL7 qt5 2019-08-06
Red Hat RHSA-2019:2002-01 EL8 redis:5 2019-08-07
Red Hat RHSA-2019:2110-01 EL7 rsyslog 2019-08-06
Red Hat RHSA-2019:2028-01 EL7 ruby 2019-08-06
Red Hat RHSA-2019:2099-01 EL7 samba 2019-08-06
Red Hat RHSA-2019:2283-01 EL7 sox 2019-08-06
Red Hat RHSA-2019:2229-01 EL7 spice-gtk 2019-08-06
Red Hat RHSA-2019:2177-01 EL7 sssd 2019-08-06
Red Hat RHSA-2019:2091-01 EL7 systemd 2019-08-06
Red Hat RHSA-2019:2402-01 EL7.3 systemd 2019-08-07
Red Hat RHSA-2019:2205-01 EL7 tomcat 2019-08-06
Red Hat RHSA-2019:2178-01 EL7 udisks2 2019-08-06
Red Hat RHSA-2019:2336-01 EL7 unixODBC 2019-08-06
Red Hat RHSA-2019:2159-01 EL7 unzip 2019-08-06
Red Hat RHSA-2019:2280-01 EL7 uriparser 2019-08-06
Red Hat RHSA-2019:2017-01 EL7 zsh 2019-08-06
Red Hat RHSA-2019:2196-01 EL7 zziplib 2019-08-06
Scientific Linux SLSA-2019:2003-1 SL7 icedtea-web 2019-07-31
Slackware SSA:2019-213-01 mariadb 2019-08-01
SUSE SUSE-SU-2019:2046-1 OS9 ardana packages 2019-08-05
SUSE SUSE-SU-2019:14139-1 SLE11 bzip2 2019-08-06
SUSE SUSE-SU-2019:2049-1 SLE15 SES6 ceph 2019-08-05
SUSE SUSE-SU-2019:2080-1 OS7 OS8 SLE12 SES4 SES5 evince 2019-08-07
SUSE SUSE-SU-2019:14141-1 SLE11 evince 2019-08-07
SUSE SUSE-SU-2019:2052-1 SLE15 evince 2019-08-06
SUSE SUSE-SU-2019:2033-1 SLE15 icedtea-web 2019-08-01
SUSE SUSE-SU-2019:2028-1 SLE12 java-1_7_0-openjdk 2019-07-31
SUSE SUSE-SU-2019:2036-1 OS7 OS8 SLE12 SES4 SES5 java-1_8_0-openjdk 2019-08-01
SUSE SUSE-SU-2019:2070-1 SLE12 kernel 2019-08-07
SUSE SUSE-SU-2019:2072-1 SLE12 kernel 2019-08-07
SUSE SUSE-SU-2019:2072-1 SLE12 kernel 2019-08-07
SUSE SUSE-SU-2019:2071-1 SLE15 kernel 2019-08-07
SUSE SUSE-SU-2019:2071-1 SLE15 kernel 2019-08-07
SUSE SUSE-SU-2019:2073-1 SLE15 kernel 2019-08-07
SUSE SUSE-SU-2019:2073-1 SLE15 kernel 2019-08-07
SUSE SUSE-SU-2019:2068-1 SLE15 linux-azure 2019-08-07
SUSE SUSE-SU-2019:2069-1 SLE15 linux-azure 2019-08-07
SUSE SUSE-SU-2019:2048-1 OS7 OS8 SLE12 SES4 mariadb 2019-08-05
SUSE SUSE-SU-2019:2078-1 SLE12 SES4 nodejs4 2019-08-07
SUSE SUSE-SU-2019:2055-1 SLE15 nodejs8 2019-08-06
SUSE SUSE-SU-2019:2043-1 SLE15 openexr 2019-08-02
SUSE SUSE-SU-2019:2067-1 SLE15 osc 2019-08-06
SUSE SUSE-SU-2019:2035-1 OS7 OS8 SLE12 SES4 SES5 polkit 2019-08-01
SUSE SUSE-SU-2019:1783-2 SLE12 postgresql10 2019-08-05
SUSE SUSE-SU-2019:2042-1 OS7 python-Django 2019-08-02
SUSE SUSE-SU-2019:2034-1 OS9 python-Django1 2019-08-01
SUSE SUSE-SU-2019:2064-1 SLE15 python 2019-08-06
SUSE SUSE-SU-2019:2066-1 OS7 OS8 OS9 SLE12 SES4 SES5 python-Twisted 2019-08-06
SUSE SUSE-SU-2019:2047-1 OS9 python-requests 2019-08-05
SUSE SUSE-SU-2019:2053-1 OS7 OS8 SLE12 SES4 SES5 python3 2019-08-06
SUSE SUSE-SU-2019:2050-1 SLE15 python3 2019-08-06
SUSE SUSE-SU-2019:2050-1 SLE15 python3 2019-08-06
SUSE SUSE-SU-2019:2032-1 SLE12 subversion 2019-08-01
SUSE SUSE-SU-2019:2031-1 SLE15 subversion 2019-08-01
SUSE SUSE-SU-2019:2030-1 SLE15 zypper, libzypp and libsolv 2019-08-01
Ubuntu USN-4087-1 18.04 19.04 BWA 2019-08-06
Ubuntu USN-4086-1 19.04 Mercurial 2019-08-06
Ubuntu USN-4085-1 16.04 18.04 19.04 Sigil 2019-08-01
Ubuntu USN-4058-2 12.04 14.04 bash 2019-08-05
Ubuntu USN-4049-4 12.04 14.04 glib2.0 2019-08-06
Ubuntu USN-4049-3 16.04 glib2.0 2019-08-05
Ubuntu USN-4069-2 18.04 linux-hwe 2019-07-31
Ubuntu USN-4083-1 18.04 19.04 openjdk-lts 2019-07-31
Ubuntu USN-4081-1 19.04 pango1.0 2019-07-31
Ubuntu USN-4084-1 16.04 18.04 19.04 python-django 2019-08-01
Ubuntu USN-4079-2 18.04 19.04 sox 2019-08-01
Ubuntu USN-4082-1 16.04 subversion 2019-07-31
Full Story (comments: none)

Kernel patches of interest

Kernel releases

Linus Torvalds Linux 5.3-rc3 Aug 04
Greg KH Linux 5.2.7 Aug 06
Greg KH Linux 5.2.6 Aug 04
Greg KH Linux 4.19.65 Aug 06
Greg KH Linux 4.19.64 Aug 04
Greg KH Linux 4.14.137 Aug 06
Greg KH Linux 4.14.136 Aug 04
Greg KH Linux 4.9.188 Aug 06
Greg KH Linux 4.9.187 Aug 04
Greg KH Linux 4.4.188 Aug 06
Greg KH Linux 4.4.187 Aug 04

Architecture-specific

Pavel Tatashin arm64: MMU enabled kexec relocation Aug 01
Steven Price arm64: Stolen time support Aug 02
Steve Capper 52-bit kernel + user VAs Aug 07
Thiago Jung Bauermann Secure Virtual Machine Enablement Aug 06
Anup Patel KVM RISC-V Support Aug 02

Core kernel

Device drivers

Device-driver infrastructure

Greg Kroah-Hartman USB: dev_groups support for usb drivers Aug 06

Documentation

Michael Kerrisk (man-pages) man-pages-5.02 is released Aug 02

Filesystems and block layer

Memory management

Security-related

Virtualization and containers

Miscellaneous

Verma, Vishal L ndctl v66 Aug 07

Page editor: Rebecca Sobol


Copyright © 2019, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds